私は自分の中でオブジェクトの個別化を学んでいて、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
メソッドを実行するにはtalk
class Foo
foo.talk
foo.talk
として呼び出しの出力を探します"huanng"
。
編集:
@Anthony Albertoからの提案に従って、talk
ofに到達できます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
をバイパスして到達する方法は?Foo
talk
talk
Bar
編集
最後に答えではありませんが、実際の必要性に近いのは@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"