2

我正在学习我的对象个性化,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对象上的单例方法并在usingfoo中执行该方法?talkclass Foofoo.talk

在调用中寻找输出foo.talk"huanng".

编辑:

根据@Anthony Alberto的建议,我可以访问talkof 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方法和?FootalktalkBar

编辑

最后不是答案,但接近实际需要的是@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"
4

2 回答 2

2

技术上不针对同一个实例调用,但 dup 不会复制单例的东西(克隆),所以你可以这样做:

foo.dup.talk

. . . 在某些情况下可能就足够了?

于 2013-03-14T14:50:27.597 回答
2

您可以,尽管它(可以理解)令人费解。您从类中获取实例方法(绕过单例类)并调用它foo

an_unbound_method = foo.class.instance_method(:talk)
a_bound_method = an_unbound_method.bind(foo)
a_bound_method.call
于 2013-03-14T15:43:39.507 回答