2011年2月 2日

[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 `<main>'

ruby 1.9 の include? は Range の端点が数値の時は、1.8 と同様に連続範囲
メンバテストを行い、端点が数値でなければ離散範囲メンバテストを行うと本にも書いて
ありますので(プログラミング言語 Ruby D.Flanagan氏, Matz氏; O'REILLY p.74)、
その意味では上記は本にも書いてある通りの挙動をしています。

仕様の問題ですので、ポストするか多少悩みましたが、case 等値 === にも影響して
おりますので念のため報告いたしました。

投稿者 xml-rpc : 2011年2月 2日 00:45
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/101725
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。