Method#unbind
とUnboundMethod#bind
の目的は何ですか?Rubyのbind/unbindメソッドの目的は何ですか?
私が集まる何から、メソッドは、メソッドは、その受信機の範囲にバインドされていることを除いて、procsのとラムダのような呼び出し可能オブジェクトです:
class SomeClass
def a_method; puts "from SomeClass"; end
end
s = SomeClass.new
s.a_method # => "from SomeClass"
私はSomeClass
のコンテキスト内だ場合、私はa_method
を呼び出すことができますまたはSomeClass
のオブジェクトがある場合。私はMethod
オブジェクトとしてメソッドを抽出して、それ呼び出し可能オブジェクトにすることができ、まだそれはまだ、この例では、クラスSomeClass
のオブジェクトにバインドされています:
m = s.method :a_method
m.class # => Method
m.owner # => SomeClass
m.call # => "from SomeClass"
は、私がその受信機からメソッドをunbind
したいと思うのはなぜ?たぶん私はこれを渡すことができますかbind
それを新しいコンテキストを与える別のオブジェクトに渡すことができます、多分私は完全に異なるオブジェクトを継承なしでこのメソッドを呼び出すことができますが、元のクラスまたはI Proc
オブジェクト(実際にラムダ、メソッドとラムダはやや類似しているため)に変換します。私はprocのにメソッドオブジェクトを変換し、多分それで何かを行うことができ
# Module#instance_method gives me an UnboundMethod
ub = SomeClass.instance_method :a_method
ub.class # -> UnboundMethod
# now I can't make any calls
ub.call # -> NoMethod Error, undefined method 'call'
class AnotherClass; end
a = AnotherClass.new
b = ub.bind(a) # -> TypeError: bind argument must be an instance of SomeClass
b = ub.bind(SomeClass.new).call # -> "from SomeClass"
:
AnotherClass.class_eval do
# I can access m becausec this block is evaluated in the same
# scope it's defined, so I can grab m ;)
define_method(:method_from_some_class, m.to_proc)
end
AnotherClass.instance_methods(false) # -> [:method_from_some_class]
a.method_from_some_class # -> "from SomeClass"
これを行う目的は何ですか?このようなことのための実際のアプリケーションは何ですか?
Welp ... http://stackoverflow.com/questions/33708250/what-is-the-point-of-rubys-method-unbinding-mechanism – ndn
私は彼らのことを理解していますが、 8年のルビープログラミングでは、時折反射的なメタプログラミングの巧みさを含めて、私はバインドされていないメソッドで 'bind'を使う必要はなかったし、まったくバインドされていないメソッドで多くを行ったことがありません。彼らはめったに必要ありません。しかし、彼らがルビーの完全な反射制御のためにそこにいるのは良いことです。あなたがそれらのための使用を見ていない場合、あなたが1つ持っているときに知っているだろうトリッキーなもののために使用がまれであるためです。それがあなたの日々のツールボックスの一部なら、あなたはおそらくあまりにも賢い方法です。 – jrochkind