Ruby:在不同的上下文中执行singleton方法

时间:2015-02-18 14:55:01

标签: ruby metaprogramming singleton-methods

(编辑以提出更具体的问题)

我想知道是否可以在另一个对象的上下文中执行单例方法,如下例所示:

class A
  def initialize
    @foo = 'foo'
  end
end

def A.singleton(*args)
  puts 'in singleton'
  puts @foo
end

A.new.instance_eval &A.method(:singleton)

# output is:
# - in singleton

# desired output:
# - in singleton
# - foo

2 个答案:

答案 0 :(得分:0)

我不认为这是可能的。具有讽刺意味的是,A::Singletons本身就是一个单例(在Singleton模式的意义上),因此,系统中只有一个A::Singletons,但A可能是{{} 1}}在许多不同的模块中,没有办法知道哪个模块添加方法。

答案 1 :(得分:0)

这是不可能的。事实上,当你尝试这样做时,Ruby有一个特定的错误:

module Foo
  def self.bar
  end
end

class Baz
end

Foo.method(:bar).unbind.bind(Baz.new)
# TypeError: singleton method called for a different object

这实际上是一种人为限制,因为UnboundMethod#bind可以很容易地跳过类型检查并让你这样做。但如果你可以使用不同的接收器调用单例方法,那将是一个基本矛盾:为单个实例定义单例方法。这是不合理的。