ダックタイピングとは
もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルに違いない
(wikipediaより)
def test(foo)
puts foo.sound
end
class Duck
def sound
'quack'
end
end
class Cat
def sound
'myaa'
end
end
test(Duck.new)
test(Cat.new)
quack
myaa
wikipedia読んでもだからなんなのというか、なんにも特別なことをしているように感じなかったのですが、調べるとどうやらそうではないことに気づきました。
型を意識しなくて良い
Javaと比較しているサイトがあり、そのコード例によりメリットが理解できました。
def test(foo)
puts foo.sound
end
void test(Duck foo) {
foo.sound();
}
もしもそのオブジェクトが Duckオブジェクト のように Walk()メソッド を呼び出すことができ、Duckオブジェクトのように Sound()メソッド を呼び出すことができるのなら、それは Duckオブジェクト として扱える。
私はpythonを主に使うので、型に対して意識することがほぼありません。rubyも同じでしょう。
しかし、Javaは違います。上記のコードでは、testは受け取るDuckの型を予め指定しています。これにより、型がなんであれ、振る舞いが同じならそれは問題ないという処理ができないわけです。
「引数 foo がどのようなオブジェクトであれ、 sound メソッドを呼び出せれば良い」と割り切っていることが、ダックタイピングです。
なるほどと思いました。
Rustは静的型付け言語ですが、トレイトという機能を使うことによりダックタイピングに似たコーディングができます。
参考文献
https://ja.wikipedia.org/wiki/ダック・タイピング
https://blog.mmmcorp.co.jp/blog/2018/10/26/go-duck-typing/