次のように、Kernel.open に pathname とブロックを渡すと、ブロックが無視されます。

% ruby -v -rpathname -e '
p open(Pathname.new("/dev/null")) {|f| 100 }
'
ruby 1.9.0 (2004-05-06) [i686-linux]
#<File:/dev/null>

調べてみると、これは Pathname が to_open というメソッドを持っているた
めのようで、次のようにしても再現します。

% ruby -e '              
class C                                     
  def to_open(*args)
    Kernel::open("/dev/null", *args)
  end
end
p open(C.new) {|f| 100 }
'
#<File:/dev/null>

そして、次のように to_open にはブロックは渡っていないので、これは意図
せざる事態のように思えます。

% ruby -e '
class C
  def to_open(*args, &block)
    p block
    Kernel::open("/dev/null", *args, &block)
  end
end                     
p open(C.new) {|f| 100 }
'
nil
#<File:/dev/null>

それはそれとして、to_path に加えて to_open があるのはなんでなんでしょ
うか?
-- 
[田中 哲][たなか あきら][Tanaka Akira]