範囲を表すリテラルが言語仕様として準備されている。
範囲リテラル
範囲クラスはRangeクラスのインスタンス。
“..”により開始、終了の両方を含む範囲を表現する。”…”だおt終了は含まれない。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def func for var in 1..10 do p var end end func # 1 2 3 4 5 6 7 8 9 10 def func2 for var in 1...10 do p var end end func2 # 1 2 3 4 5 6 7 8 9 |
包含と同値
include?により範囲に値が含まれるかどうかを調べられる。
1 2 |
(1..5).include?(3) # true (1..5).include?(6) # false |
なお、===演算子も包含関係を表す。
1 2 |
(1..5) === 3 # true (1..5) === 10 # false |
==演算子は同値関係を表す。
1 2 |
(1..5) == (1..5) # true (1..5) == 3 # true |
添字演算子
配列の添字演算子に範囲を指定することができる。何番目から何番目という表現はかなり直感的。
1 2 3 |
a = [ 1, 2, 3 ,4 ,5] p a[1..2] # [2..3] p a[1,3] # |
文字列の添字演算子にも範囲を指定することができる。部分文字列を範囲で表現できる。直感的。
1 2 |
a = "abcdef" p a[1..2] # bc |
case式
phpなど他の言語のswitch文。case when.. と書く様子。
でもなぜswitchではいけなかったのだろうか。
case式自体の評価値はcase式内で最後に評価された値となる。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def hoge a case a when 10 then p "first" when 20 then p "second" else p "third" end end hoge 10 # "first" hoge 20 # "second" hoge 30 # "third" |
whenで何が行なわれているかというと、===演算子によって同値の判断がされている。
なので、whenにRangeを指定すると、===演算子によって包含関係が評価される。
while式
phpのwhileと同等。条件が真である間繰り返す。
1 2 3 4 5 |
i = 0 while (0..5) === i do p i i += 1 end # 1 2 3 4 5 |
phpなどにもあるように、ループの末尾にwhileを書くことができる。
最初の1回は必ず実行される例のやつ。
後に置くので”後置while”という名前がついている。
1 2 3 4 5 |
i=0 begin p i i+=1 end while (1..4) === 1 # 0 1 2 3 4 |
後置whileとは別に、後に置くが”修飾詞”として使う書き方がある。
最初の1回はwhileが評価されるところが後置ifと異なる。
1 2 |
i=0 p i += 1 while (0..4) === i # 1 2 3 4 5 |
until式
条件が真になるまで繰り返す(真になったら抜ける)、専用の条件式。
Rubyは条件式を書く時に否定文を書く必要がない。(たぶん)
1 2 3 4 5 |
i=0 until i===5 do p i i+=1 end # 0 1 2 3 4 |