From: __JC__ <02ybur@...> Date: 2011-02-02T00:45:12+09:00 Subject: [ruby-list:47818] Ruby 1.9 Range オブジェクトのメンバテスト挙動について JC と申します。初めまして。 Time オブジェクトを端点に持つ Range オブジェクトの挙動が ruby 1.8 と ruby 1.9 で異なりました。 1.8 と 1.9 の仕様の 違いの問題かとも思いましたが、念のため報告いたします。 ## コード (eg.rb) t0 = Time.now t1 = t0 + 1 t2 = t0 + 2 puts (t0..t2).include?(t1) ## コード実行結果 (ruby 1.8.7) ~/ > /usr/bin/ruby --version ruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0] ~/ > /usr/bin/ruby eg.rb true ## コード実行結果 (ruby 1.9.2) ~/ > /usr/local/bin/ruby --version ruby 1.9.2p136 (2010-12-25 revision 30365) [x86_64-darwin10.6.0] ~/ > /usr/local/bin/ruby eg.rb eg.rb:4:in `each': can't iterate from Time (TypeError) from eg.rb:4:in `include?' from eg.rb:4:in `include?' from eg.rb:4:in `
' ruby 1.9 の include? は Range の端点が数値の時は、1.8 と同様に連続範囲 メンバテストを行い、端点が数値でなければ離散範囲メンバテストを行うと本にも書いて ありますので(プログラミング言語 Ruby D.Flanagan氏, Matz氏; O'REILLY p.74)、 その意味では上記は本にも書いてある通りの挙動をしています。 仕様の問題ですので、ポストするか多少悩みましたが、case 等値 === にも影響して おりますので念のため報告いたしました。