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、オブジェクトのシングルトン メソッドの呼び出しをバイパスし、 using ?内でfooメソッドを実行するには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

(当然のことながら)複雑ですが、できます。(シングルトン クラスをバイパスする) クラスからインスタンス メソッドを取得し、それを on で呼び出します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 に答える
2

技術的には同じインスタンスに対して呼び出しませんが、dup はシングルトンのものをコピーしません (clone will ) ので、これを行うことができます:

foo.dup.talk

. . . 場合によってはそれで十分かもしれませんか?

于 2013-03-14T14:50:27.597 に答える