@ITのRuby入門記事の間違い

RubyのRangeクラスと範囲オブジェクト、範囲演算子、イテレーターの使い方 (1/3):若手エンジニア/初心者のためのRuby 2.1入門(4) - @IT
の内容間違いについて。


入門記事なんだから実装内部のことなど書く必要ないのに、書いて間違っている。


2ページ目の、「Rangeクラスのメソッドで範囲内に存在するかを調べる」の部分。
趣旨としては、
・Range#include? は範囲内の要素と === で比較して一致するものがあるかどうかを調べている
・Range#cover? は範囲の両端と <=> で比較して範囲内にあるかどうか調べている
ということだが、少なくともMRIの include? については誤り。


Range#include? は両端が数値または長さ1の文字列の時は、両端と <=> 大小比較している。全要素を調べているわけじゃない。
それ以外のケースでは、親クラスの Enumerable#include? で処理している。ここで初めて一致するものが無ければ全要素がチェックされる。
ただし、そこでは == で各要素と一致を比較している。=== ではない。


Range#=== が Range#include? を使っていることと混同してしまって、こんなことを書いてしまったのではないか。


ついでに書くと、1ページ目の 補足「for文における範囲オブジェクトとイテレーター」 は補足じゃなくて蛇足。
forよりイテレータが好まれる主要理由が変数のスコープにあると誤解させかねない。このコラムはない方が良い。