[ruby-list:49796] Range class?
From:
"Masa" <imagine@...>
Date:
2014-04-20 10:36:04 UTC
List:
ruby-list #49796
坂野正明です。
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]
--
坂野正明