From: Masa Date: 2014-04-20T19:36:04+09:00 Subject: [ruby-list:49796] Range class? 坂野正明です。 Range クラスの振舞いについて、二、三、不自然な点に 気付きました。 いずれも滅多に遭遇するものではないでしょうが、 意図された挙動では無いのではないかと思いました。 マニュアルにも特に注意書きはありません。 http://www.ruby-doc.org/core-2.1.1/Range.html http://docs.ruby-lang.org/ja/2.1.0/class/Range.html 以下のものです。 [1] max と minmax irb> (0...3.5).max TypeError: cannot exclude non Integer end value from (irb):1:in `max' irb> (0...3.5).minmax # => [0, 3] この二つが異なる結果を返すのは、期待していませんでした。 因みに、他の挙動(以下に例)は、納得できるものでした。 irb> (0...3).max # => 2 irb> (0...3).minmax # => [0, 2] irb> (0...3.5).max_by.each{|i|i} # => 3 irb> (0...3.5).minmax_by.each{|i|i} # => [0, 3] [2] size irb> (1..5.1).size # => 5 irb> (1...5.1).size # => 5 irb> (1..5).size # => 5 irb> (1.2..5).size # => 4 irb> (1...5).size # => 4 irb> (1.0...5).size # => 4 irb> (Rational(2,3)...5).size # => 4 irb> (Rational(1,2)...5).size # => 4 irb> (0.5...5).size # => 5 # Why not 4?? irb> (Rational(1,3)...5).size # => 4 irb> (Rational(3,2)...5).size => 3 irb> (1.5...5).size # => 4 # Why not 3?? irb> (1.5...4.9).size # => 4 # Why not 3?? irb> (1.5...Rational(49,10)).size # => 4 # Why not 3?? irb> (1.5...Rational(45,10)).size # => 3 irb> (1.5...4.5).size # => 3 Range の beginが Integerに一致しない Floatの時の 挙動が、他と矛盾します。 端が Integer でないときの Numericの Rangeの size()とは 何ぞや、というのは議論(考え方)があってもいいと思いますが、 同値(==)である Rationalとも返り値が異なることがあるのは 期待していませんでした。 また、最後の四例の endの Rational/Floatの例も 私の予想からは一部ずれていました。(beginはそうでは ないけれど)endの値については、Numericの時に、 四捨五入(但し、五は切捨て?)か何かをしているように見えます。 以上です。 なお、ここで使用した Ruby は以下です。 % ruby2.1 --version ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13] -- 坂野正明