動的型付け言語の特徴である、ポリモーフィズム。
その中でも、特に良く言われるのが「ダックタイピング」という奴です。
"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と書いても、渡したクラスに当該メソッドがあれば、しっかり呼び出されます。
言い方を変えれば、誤用時に同名メソッドが起動する恐れがあるという事です。