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

标签 ruby

我正在我的 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的建议,我可以联系talkBar .

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

同一条路线如何到达talkFoo绕过单例方法talktalkBar

编辑

最后不是答案,但接近实际需求是按照@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/

相关文章:

java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi?

ruby - Windows 应用程序数据目录

ruby-on-rails - 将 ACL 设置为 public_read 的文件上传到 AWS S3

Ruby 检查此目录中是否安装了某些东西(--bind)

ruby - 有没有办法从字符串形式的结构创建 Ruby 结构?

ruby - Rake 删除文件任务

Ruby 如何在初始化方法之外但在类内部获取变量的值?

ruby - Laravel Homestead 的 Vagrantfile : where is $confDir supposed to be set?

ruby - 为什么这是 ERB 的错误?

ruby - 确定 http ://foo. com 是否重定向到 http ://www. foo.com