で定義されていないメソッドを呼び出すメソッドは、特別なクラスとして定義された外部APIを使用しています。ほとんどの標準メソッドはxmlの構築に使用するために未定義です。ここで、#method_missing
は、オブジェクト上で呼び出された欠落したメソッド名に基づいて要素を生成します。ruby
は、基本的にはクラス本体での効果に何かがある:
undef_method :send
は今、私はプログラム的に名前でメソッドを呼び出したいです。私はeval "obj.#{something}"
を使うことができると思うが、私は本当に好きではないeval
。 メソッド#send
の未定義を元に戻すための暗部テクニックがあるはずですので、別名#__send__
にエイリアスして再度定義解除することができます。そうすれば、evalなしで名前でメソッドを呼び出すことができます。例えばobj.__send__(:something, params)
。
だから私の質問は、#send
の方法を元に戻すために猿のパッチを適用することです。そのようなことは何も見つかりません。誰もそれについて尋ねることさえできません。
更新:私の元の問題は、とにかく方法#__send__
があるので問題ではなかったが、私は#send
しか知りませんでした。問題のもう一つの部分は、未定義の方法を復元する方法でした。 @philomory asnwerの助けを借りて、ここで私が持っているものです:
[46] pry(#<CucuShift::DefaultWorld>)> class A
[46] pry(#<CucuShift::DefaultWorld>)* def gah
[46] pry(#<CucuShift::DefaultWorld>)* puts "gah"
[46] pry(#<CucuShift::DefaultWorld>)* end
[46] pry(#<CucuShift::DefaultWorld>)* end
=> :gah
[49] pry(#<CucuShift::DefaultWorld>)> class C < A
[49] pry(#<CucuShift::DefaultWorld>)* undef_method :gah
[49] pry(#<CucuShift::DefaultWorld>)* end
=> C
[50] pry(#<CucuShift::DefaultWorld>)> C.new.gah
NoMethodError: undefined method `gah' for #<C:0x000000070d7918>
[57] pry(#<CucuShift::DefaultWorld>)> class C
[57] pry(#<CucuShift::DefaultWorld>)* define_method :fff , A.instance_method(:gah)
[57] pry(#<CucuShift::DefaultWorld>)* end
=> :fff
[58] pry(#<CucuShift::DefaultWorld>)> C.new.fff
gah
私は混乱している:私はあなたがBasicObjectせずにルビーの以前のバージョンを使用している場合と仮定し、けれども
__send__
あなたはそれがこの方法を行いますか? –愚かな書式設定 - 私は '#__ send__'メソッドがあることを知らなかったので、私は' __send__'を –
@FrederickCheungと意味しました。私は '#send'しか知りませんでした。私は否定的な質問の評価を説明すると思います。本当に悪いドキュメント、とにかく、あなたに感謝します。 – akostadinov