Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

Rangeで最大値を含みたくないときは「...」が使える

繰り返しやcase文の条件式でとっても便利なRangeクラス
よくある入門書では「A..B」が紹介されてますね

> b = (1..3)
=> 1..3

> b.each {|i| puts i}
1
2
3
=> 1..3

こいつにドットをもう一個追加すると最大値を除外することができます

> a = (1...3)
=> 1...3

> a.class
=> Range

> a.each {|i| puts i}
1
2
=> 1...3

もうちょっと突っ込んだ話

とまぁ、繰り返し式で使うと便利な子です。
これを条件式に使うと、sedawk等々のUNIX文化から移植されてきた挙動をします。
「..」はともかく、「...」は相当奇妙な挙動をします。
以下、公式を参考に

> 5.times {|n| p n if( (n==2)..(n==2) ) }
2
=> 5

> 5.times {|n| p n if( (n==2)...(n==2) ) }
2
3
4
=> 5

>5.times {|n| p n if( (n==2)...(n!=2) ) }
2
3
=> 5

> 5.times {|n| p n if( (n!=2)...(n==2) ) }
0
1
2
3
4
=> 5

......相当な捻くれモノですね(
ちゃんと理解できるようになったら別途記事にします。

http://docs.ruby-lang.org/ja/1.9.3/doc/spec=2foperator.html#range