範囲リテラル、case式、while式

範囲を表すリテラルが言語仕様として準備されている。

範囲リテラル

範囲クラスは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