@mattn_jp BoolClassを入れるとkind_of?でチェックしたくなってduck typingを阻害するから。
— Yukihiro Matsumoto (@yukihiro_matz) 2015, 12月 4
30回くらい読みなおしたけど何のことを言っているのか分からなかったので、周りのRubyistに質問して理解を深めたメモ。
まずDuck Typingというのは、Wikipediaによると
ダック・タイピング(duck typing)とは、Smalltalk、Python、Rubyなどのいくつかの動的型付けオブジェクト指向プログラミング言語に特徴的な型付けの作法のことである。それらの言語ではオブジェクト(変数の値)に何ができるかはオブジェクトそのものが決定する。つまり、オブジェクトがあるインタフェースのすべてのメソッドを持っているならば、たとえそのクラスがそのインタフェースを宣言的に実装していなくとも、オブジェクトはそのインタフェースを実行時に実装しているとみなせる、ということである。それはまた、同じインタフェースを実装するオブジェクト同士が、それぞれがどのような継承階層を持っているのかということと無関係に、相互に交換可能であるという意味でもある。
よく聞くこれです。
"If it walks like a duck and quacks like a duck, it must be a duck"
もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである
例えばある変数を考えた時、静的型付け言語では変数の型によって、そのオブジェクトがどのようなふるまいを持つのかを定義します。一方でRubyでは、そのオブジェクトが持つふるまいによってどんなオブジェクトであるのかを表現します。
ですので、以下のように書くのはRubyでは推奨されない。
def hoge x
raise "boolean class only!" unless x.kind_of?(BoolClass)
...
end
BoolClassを用意すると、その変数がBoolClassであるかどうかをチェックしてしまいたくなる。
つまりBoolClassとしてではなく、BoolのようなふるまいをするものとしてTrueClass/FalseClassを用意することで、Duck Typingになりやすいように設計されているという理解です。