Ruby 委譲
Rubyの便利な委譲な仕組み。
一つ目。Forwardableモジュール。
class Sony extend Forwardable def_delegators :@keyaki, :discord def initialize(keyaki) @keyaki = keyaki end end class Keyaki def discord print '僕は嫌だ!' end end sony = Sony.new(Keyaki.new) sony.discord # 僕は嫌だ!
def_delegatorsメソッドの引数に、委譲先のオブジェクト、委譲するメソッドを指定。
Sonyはdiscordメソッドを持っていないにもかかわらず、実行できている。
内部では、Keyakiオブジェクトが、discordを実行している。
二つ目。method_missing。
これは、PHPのマジックメソッド__call()と似たようなもの。
class Sony def initialize(keyaki) @keyaki = keyaki end def method_missing(name, *args) @keyaki.send name, *args end end class Keyaki def discord print '僕は嫌だ!' end end sony = Sony.new(Keyaki.new) sony.discord # 僕は嫌だ!
メソッド名を指定しなくていい分、こっちの方が楽かも。
何とかここらへんをうまく使って、Proxyパターンを楽に実装していきたい。