Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ダックタイピングというものの自習メモ

動的型付け言語の特徴である、ポリモーフィズム
その中でも、特に良く言われるのが「ダックタイピング」という奴です。

"If it walks like a duck and quacks like a duck, it must be a duck"
(もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである)

動的言語では、渡したモノがどう振舞うかは渡したもの自身が決定します。
メソッドがあれば、継承等々なしにソレを呼び出します。
method_missingとかいう怖い子もいるらしいですが、今回はそこまで突っ込んだお勉強はしていません。

例その1

def add_values(*v)
  v.inject {|result, item| result += item}
end

p add_values(1,2,3,4)
p add_values('a','b','c')
p add_values([1,2],[3,4])

同じメソッド(この場合は、+)がある事を期待できるならこういう書き方も可能です。

$ ruby addValues.rb 
10
"abc"
[1, 2, 3, 4]

例その2

class Duck
  def quack
    puts "Quaaaaaack!"
  end

  def is_duck?
    true
  end

  def feathers
    puts "The duck has white and gray feathers."
  end
end
 
class Person
  def quack
    puts "The person imitates a duck."
  end

  def is_duck?
    nil
  end
 
  def feathers
    puts "The person takes a feather from the ground and shows it."
  end
end
 
def in_the_forest(duck)
  duck.quack
  printf " *The duck test* : %s\n" % [ duck.is_duck? ? "ture" : "false"]
  duck.feathers
end
 
def game
  donald = Duck.new
  john = Person.new
  in_the_forest donald
  in_the_forest john
end
 
game

これ、どうなると思いますか?

$ ruby duck.rb 
Quaaaaaack!
 *The duck test* : ture
The duck has white and gray feathers.
The person imitates a duck.
 *The duck test* : false
The person takes a feather from the ground and shows it.

引数にduckと書いても、渡したクラスに当該メソッドがあれば、しっかり呼び出されます。
言い方を変えれば、誤用時に同名メソッドが起動する恐れがあるという事です。