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

Ruby: execute singleton method in different context

(编辑使问题更具体)

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

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

我认为这是不可能的。具有讽刺意味的是,A::Singletons 本身就是一个单例(在单例模式的意义上),因此,由于系统中只有一个单例 A::Singletons,但 A 可能是 includeded在很多不同的模块中,无法知道在哪个模块中添加该方法。

这是不可能的。事实上 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 可以很容易地跳过类型检查而让你去做。但是,如果您可以使用不同的接收者调用单例方法,那将是一个根本的矛盾:单例方法是为 single 实例定义的。这是不允许的。