Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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