[ruby-list:50877] Re: パス名なのかIO(っぽい)オブジェクトなのかを検出する方法

From: Tadashi Saito <tad.a.digger@...>
Date: 2020-02-24 13:46:56 UTC
List: ruby-list #50877
斎藤です。

> がしかし、
>
> ・Pathname#to_s ... ある
> ・Pathname#to_str ... ない
> ・IO#to_s ... ない
> ・StringIO#to_s ... ある(←!)

ああ、すみません。 Pathname#to_strがないのですね……失礼しました。

respond_to?(:pos)を追加で使う方法以外に、自分が思いつくのは

* 何にでも File.open を試みる
    * 既に開いているかどうかは、respond_to? 含めて closed? で分岐する
* 開けなかったらTypeErrorになるのでIO-likeとしてそのまま使う

という方法くらいです。(が、動作未検証です)


2020年2月24日(月) 21:58 Tietew <tietew@tietew.net>:

> ありがとうございます。
>
> On Fri, 21 Feb 2020 21:08:57 +0900
> Tadashi Saito <tad.a.digger@gmail.com> wrote:
>
> > 「パス名」は文字列のはずなので、respond_to?(:to_str)とか:to_sで
> > 場合分けするのはどうでしょうか?
> > 少なくともIO, StringIOにはないメソッドのようでした。
>
> がしかし、
>
> ・Pathname#to_s ... ある
> ・Pathname#to_str ... ない
> ・IO#to_s ... ない
> ・StringIO#to_s ... ある(←!)
>
> $ ruby -rstringio -ve 'p StringIO.new.to_s'
> ruby 2.7.0p0 (2019-12-25 revision 647ee6f091) [x86_64-linux]
> "#<StringIO:0x0000561329b79ed0>"
>
> :(
>
> > 別のやり方として、「IOっぽい」という判定にrespond_to?(:pos)を追加するのもありかもしれません。
> > ただこちらは、あまり調べていません。
>
> そうなるのかなあ?
>
>
> --
> Tietew <tietew@tietew.net>
> Blog: http://www.tietew.jp/
> PGP: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA
>
>

-- 
斎藤 匡

In This Thread

Prev Next