我正在我的 IRB
中学习对象个性化我确实尝试了下面的代码:
class Foo
def talk
p "huanng"
end
end
#=> nil
module Bar
def talk
p "hunnggg"
end
end
#=> nil
foo = Foo.new
#=> #<Foo:0x1152b88>
class << foo
def talk
p "hukkangg"
end
include Bar
end
#=> #<Class:#<Foo:0x1152b88>>
foo.talk
"hukkangg"
#=> "hukkangg"
上面的输出非常明显。
无论如何都要绕过调用单例方法 talk
在物体上foo
并执行方法talk
里面class Foo
使用foo.talk
?
查找调用 foo.talk
的输出如"huanng"
.
编辑:
根据@Anthony Alberto的建议,我可以联系talk
的Bar
.
class Foo
def talk
p "huanng"
end
end
#=> nil
module Bar
def talk
p "hunnggg"
end
end
#=> nil
foo = Foo.new
#=> #<Foo:0x1152b88>
class << foo
def talk
super
return
p "hukkangg"
end
include Bar
end
#=> #<Class:#<Foo:0x11f6670>>
foo.talk
"hunnggg"
#=> nil
同一条路线如何到达talk
的Foo
绕过单例方法talk
和talk
的Bar
?
编辑
最后不是答案,但接近实际需求是按照@Neil
class Foo
def talk
p "huanng"
end
end
#=> nil
module Bar
def talk
p "hunnggg"
end
end
#=> nil
foo = Foo.new
#=> #<Foo:0x1152b88>
class << foo
def talk
p "hukkangg"
end
include Bar
end
#=> #<Class:#<Foo:0x1200db0>>
foo.dup.talk
#"huanng"
#=> "huanng"
foo.talk
#"hukkangg"
#=> "hukkangg"
最佳答案
你可以,尽管它(可以理解)很复杂。您从类中获取实例方法(绕过单例类)并在 foo
上调用它:
an_unbound_method = foo.class.instance_method(:talk)
a_bound_method = an_unbound_method.bind(foo)
a_bound_method.call
关于ruby - Ruby 中是否可以绕过单例方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15411360/