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