12

我想知道我是否可以强迫这种情况发生

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 中复制的变量。我真的很想知道如何强制这种绑定。

4

2 回答 2

2

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

这也很明显,一个类的细节不能转移到另一个类的实例。它只能与被授权携带该信息的实例绑定,即该类或其子类的实例。

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

于 2012-11-05T19:05:46.307 回答
1

Method 和 UnboundMethod 类型期望绑定目标必须是您引用该方法的原始类的子类。将方法转换为 proc 摆脱了子类约束,但只有 Methodto_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 中测试

于 2015-11-02T16:45:36.870 回答