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
可能是 include
ded在很多不同的模块中,无法知道在哪个模块中添加该方法。
这是不可能的。事实上 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 实例定义的。这是不允许的。
(编辑使问题更具体)
我想知道是否可以在另一个对象的上下文中执行单例方法,如下例所示:
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
可能是 include
ded在很多不同的模块中,无法知道在哪个模块中添加该方法。
这是不可能的。事实上 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 实例定义的。这是不允许的。