【问题标题】:Ruby Unbound Methods: Is it possible to force bind to instances of other classes?Ruby Unbound Methods:是否可以强制绑定到其他类的实例?
【发布时间】:2012-11-05 14:37:46
【问题描述】:

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

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>"。不过,我认为不可能在您的示例中强制绑定。
  • 是的,那是因为String继承自Object,你可以将超类实例方法绑定到它的子类实例。一个例子:A类;定义吨; “一个” ;结尾 ;结尾 ; B类
  • 如果 A 本来是 module,那么在 ruby​​ 2 中是可能的

标签: ruby instance-methods


【解决方案1】:

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

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

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

【讨论】:

    【解决方案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 中测试

    【讨论】:

      猜你喜欢
      • 2015-03-12
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多