(编辑以提出更具体的问题)
我想知道是否可以在另一个对象的上下文中执行单例方法,如下例所示:
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
答案 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
可以很容易地跳过类型检查并让你这样做。但如果你可以使用不同的接收器调用单例方法,那将是一个基本矛盾:为单个实例定义单例方法。这是不合理的。