[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
>
>
--
斎藤 匡