私は自分の中でオブジェクトの個別化を学んでいて、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"