けいじゅ@いしつかです.

In [ruby-dev:40480] the message: "[ruby-dev:40480] Re: バグ? ブロック
引数で to_ary が呼ばれる必要のない場面で呼ばれる", on Feb/24
23:12(JST) Yukihiro Matsumoto writes:

>まつもと ゆきひろです

>|class E
>|#   def method_missing(method, *args, &block)
>|#     raise NoMethodError, "to_ary"
>|#   end
>|
>|  def to_ary
>|    raise NoMethodError.new("to_ary", :to_ary)
>|  end
>|end
>|
>|下記の理由で, to_aryは定義されているが, 存在しないように見せかけたいた
>|めです.

>このように書き換えたんですね。ありがとうございます。それは良
>いのですが、すると何が起きることを期待していて、実際はどうなっ
>たかについて、それからどのバージョンのRubyで実行したかの情報
>も欲しかったなあ。今回はなんとなくわかったけど。

バージョンは最新版です. ruby 1.9.2dev(2010-02-24)

元のスクリプトの 75行目あたりでの処理
  
  @c.d.each_export_by(@c.a, self) do |export, opts={}|

を例外なく処理したいわけです.


>で、ですね。この議論の後、この部分の挙動は
>
>  * NoMethodErrorが発生し、
>  * かつ、呼び出したオブジェクトが、元となったメソッドに
>    respond_to?しない

2番目が良くわからなかったのですが, この場合で言えば, 上記の式で

  export.respond_to?(:to_ary)

がfalseになるってことです?

>ときに捕捉するという風になってます。ですから、今回の to_ary
>を定義するというやり方は、一番相性が悪かったわけですね。ので、

うーん.

>class E
>  def method_missing(method, *args, &block)
>    if method == :to_ary
>      raise NoMethodError.new("to_ary", :to_ary)
>    end
>  end
>end
>
>という風にするのはどうでしょうか。

たしかにその手もありますが, これだと, メソッド呼び出しの度に :to_aryの
チェックが入るのでできれば避けたくて, to_aryのみの対応で済まないものか
と...

to_aryを定義しておいて, さらに, E#respond_to?を以下のように定義しても
NGなんですが...

class E
  def respond_to?(method)
    if method == :to_ary
      false
    else
      super
    end
  end
end

やっぱそういうものです? 

__
---------------------------------------------------->> 石塚 圭樹 <<---
---------------------------------->> e-mail: keiju / ishitsuka.com <<---