Ruby未绑定方法: 是否可能强制绑定到其他类的实例?

14

我想知道我是否能强制这种情况发生

class A
  def bomb ; "bomb" ; end
end

class B ; end

bomb = A.instance_method(:bomb)

b = B.new
bomb.bind(b)

目前它会抛出TypeError: bind argument must be an instance of A的错误。

我认为这非常限制了我对这些未绑定方法所能做的事情,可能性有点受限。在像这样的情况下(我不仅指幂等函数),强制绑定是有意义的吧?如果我正在处理从A中未复制到B中的变量,则执行错误就足够了。我真的很想知道如何强制执行此绑定。


有趣的事情是可能的:Object.instance_method(:to_s).bind("hello world").call #=> "#<String:0x0000000195e1f0>"。但我认为在你的例子中强制绑定是不可能的。 - Scott Olson
2
是的,这是因为String继承自Object,你可以将超类实例方法绑定到其子类实例。例如:class A; def t; "A"; end; end; class B < A; def t; "B"; end; end; A.instance_method(:t).bind(B.new).call。但是,我仍然想将该方法转换为函数,然后转换为proc,然后在任何我想要的地方调用它。但也许我是一个梦想家 :) - ChuckE
如果A是一个模块,那么在Ruby 2中是可能的。 - Amol Pujari
2个回答

2

Method和UnboundMethod类型要求绑定目标必须是引用该方法的原始类的子类。将方法转换为proc可以消除子类约束,但只有Method实现了to_proc方法。

class A
  def bomb ; "bomb" ; end
end

class B ; end

bomb = A.new.method(:bomb)

B.send(:define_method, :bomb_in_b, &bomb) #converting to proc

b = B.new
puts b.bomb_in_b

在 Ruby 2.2.3 中进行了测试


2

你不能将一个类的实例与另一个类的方法绑定。除非该实例是该类或其子类的对象。

这也很明显,一个类的详细信息无法传递到其他类的实例中。它只能与被授权携带该信息的实例绑定,即该类或其子类的实例。

因此,Ruby通过不将特定类的方法绑定到另一个类的实例来维护封装性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接