孤独プログラマー譚

孤独死が近い。

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パターンを楽に実装していきたい。