Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

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

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