読者です 読者をやめる 読者になる 読者になる

Ruby のダックタイピング

デザインパターンを勉強していて、Ruby では Java で云う「インターフェイス」というのはどうなっているのかと思った。ぐぐってみると、わかりやすい解説を発見。
第127回 Ruby vs Java ダックタイピングとインタフェースで見る多態性 - bingo_nakanishiの他言語出身者のためのPerl入門

結論から云うと、Ruby ではいわゆる「ダックタイピング」というものがあるので、インターフェイスは(必要)ないのである。上のサイトの例をコピペ。

class Dog
  def say; puts 'ワンワン'; end
end

class Duck
  def say; puts 'ガーガー'; end
end

class Human
  def touch(animal)
    animal.say
  end
end

human = Human.new
dog   = Dog.new
duck  = Duck.new

human.touch(dog)    #=>"ワンワン"
human.touch(duck)   #=>"ガーガー"

これがダックタイピングである。人が撫でれば、犬なら「ワンワン」、アヒルなら「ガーガー」というわけで、touch メソッドの引数の型は予め指定されない。クラス Dog と Duck が同名の say メソッドをもってさえいればよい。これは、Java と設計思想がまるで逆だ。Rubyプログラマを信用し、書きやすさが追求される。Javaプログラマは間違えることを前提とし、冗長さの代りに安全性を取る。おもしろいですねえ。

Rubyインターフェイスがない副作用は、コメントで解決できないかと思ったり…。