9

なぜこれが機能しないのですか?

module StringRefinement
  refine String do
    def bar
      length
    end
  end
end

using StringRefinement
"abcdefghijklmnopqrstuvwxyz".send(:bar)
#NoMethodError: undefined method 'bar' for "abcdefghijklmnopqrstuvwxyz":String

なぜsendここで機能しないのか誰かが説明できますか?そして、改良で定義されたメソッドを動的に呼び出す方法はありますか?Ruby2.0で改良がどのように機能するかについての適切で完全な説明を見つけることができないようです。

4

2 に答える 2

9

仕様がそう言っているので:

間接的なメソッドアクセス

、、などの間接的なメソッドアクセスはKernel#send、メソッドルックアップ中の呼び出し元コンテキストの改良を尊重しませんKernel#methodKernel#respond_to?

于 2013-03-07T12:50:43.787 に答える
0

「これは仕様です」と言いたくなる。しかし、この設計が完全に安定していない可能性は十分にあります。たとえば、moduleスコープclass機能は数か月前に削除されました。

現時点では、Ruby HEAD でも、すべての悪の根源を使用するしか方法はありません。

eval "puts 'abcdefghijklmnopqrstuvwxyz'.bar" # => 26

でも、これはラボ用ですよね?そのようなコードをチェーン解除しないでください。子猫は死んでしまいます。

于 2013-03-07T11:17:02.990 に答える