nil module Ba-6ren">
gpt4 book ai didi

ruby - 在 Ruby 中是否可以绕过单例方法调用?

转载 作者:数据小太阳 更新时间:2023-10-29 08:39:09 25 4
gpt4 key购买 nike

我在我的 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"

上面的输出非常明显。

无论如何,通过调用对象 foo 上的单例方法 talk 并在 类中执行方法 talk 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

在同一条路线上如何绕过单例方法talktalk到达Footalk?

编辑

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com