Ruby中绑定/取消绑定方法的用途是什么?

Ruby中绑定/取消绑定方法的用途是什么?,ruby,metaprogramming,Ruby,Metaprogramming,使用方法#解除绑定和解除绑定方法#绑定的目的是什么 据我所知,方法是可调用的对象,如procs和lambdas,除了方法绑定到其接收方的范围之外: class SomeClass def a_method; puts "from SomeClass"; end end s = SomeClass.new s.a_method # => "from SomeClass" 如果我在SomeClass的上下文中,或者如果我有SomeClass的对象,我可以调用a_方法。通过将方法提取为方

使用
方法#解除绑定
解除绑定方法#绑定
的目的是什么

据我所知,方法是可调用的对象,如procs和lambdas,除了方法绑定到其接收方的范围之外:

class SomeClass
  def a_method; puts "from SomeClass"; end
end

s = SomeClass.new
s.a_method # => "from SomeClass"
如果我在
SomeClass
的上下文中,或者如果我有
SomeClass
的对象,我可以调用
a_方法。通过将方法提取为
方法
对象,我可以使其成为可调用对象,但在本例中,它仍然绑定到class
SomeClass
的对象:

m = s.method :a_method
m.class # => Method
m.owner # => SomeClass
m.call # => "from SomeClass"
为什么我要
从其接收器中解除绑定方法?也许我可以将其传递给另一个对象,或者将其绑定到另一个对象,给它一个新的上下文,也许我可以让一个完全不同的对象在没有继承的情况下调用这个方法,但是我不能对它做任何事,除非我将它绑定到其原始类的对象,或者我将它转换为
Proc
对象(实际上是lambda,因为方法和lambda有些相似):

我可以将method对象转换为proc,并可能对其执行一些操作:

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"

这样做的目的是什么?这样做的实际应用程序是什么?

它确实对元编程很有用。假设您想知道
SomeClass#method
的源代码的位置。如果您可以生成
SomeClass
的实例,那么您可以创建(绑定)在
SomeClass
实例上的方法实例,您可以在该实例上调用各种方法来研究该方法的一些元数据。但是如果您不知道
SomeClass#new
的方法签名,或者如果
SomeClass
的构造函数方法的名称不是
SomeClass#new
,那又该怎么办呢定义
SomeClass
的实例可能很困难。这就是unbound方法的用武之地。不必为类的特定实例或如何创建实例而烦恼,只需执行
SomeClass.instance\u方法(:a\u方法)
(这是一种unbound方法),然后在其上调用
source\u location
,以调查定义的位置:

unbound = SomeClass.instance_method(:a_method)
puts unbound.source_location

在现实世界的应用程序中,这种元编程什么时候是必要的?一个例子是,当您创建一个带有方法查找功能的IDE时。

Welp…我知道它们是做什么的,但我要说的是,在8年的ruby编程中,包括偶尔的反射元编程技巧,我从未使用过<代码>在未绑定的方法上绑定
,或者使用未绑定的方法完成很多工作。它们很少被需要。但它们在ruby中用于完全的反射控制很好。如果你看不到它们的用途,那是因为当你有了它们时,你会知道它们很少用于棘手的事情。如果它是你日常工具箱的一部分,你是专业的bably太聪明了。
unbound = SomeClass.instance_method(:a_method)
puts unbound.source_location