以下の三つはすべて同じ意味となります。
var = gets.to_i
if var < 256 then
puts "var is less than 256."
elsif var > 256 then
puts "var is greater than 256."
else
puts "var is equal to 256."
end
ifまたはelsifのthenは省略可能です。
var = gets.to_i
if var < 256
puts "var is less than 256."
elsif var > 256
puts "var is greater than 256."
else
puts "var is equal to 256."
end
ただし、次のようにifまたはelsifのあとに改行が記述されない場合はthenは省略不可です。
var = gets.to_i
if var < 256 then puts "var is less than 256."
elsif var > 256 then puts "var is greater than 256."
else puts "var is equal to 256."
end
また、一行で記述できる処理は、Perlにもあるif修飾子が使用できます。
var = gets.to_i
puts "var is greater than 0." if var > 0
unlessはif notと同じで、
var = gets.to_i
unless var > 0
puts "var needs to be greater than 0."
end
上のコードは次のコードと同じ動作をします。
var = gets.to_i
if not var > 0
puts "var needs to be greater than 0."
end
ifと同様に一行であればunless修飾子を使用できます。
var = gets.to_i
puts "var needs to be greater than 0." unless var > 0
他の言語にもある普通の条件演算子です。
var = (1+1==2) ? 777 : 888
puts var
これは、Rubyではif-elseを用いて次のようにも書けます。
var = if 1+1==2 then
777
else
888
end
puts var
表題にもあるように、if-elseなどを制御文とよばずに制御式とよんでいるのは、
それらが値を返すからです。if内あるいはelsif、else内で最後に評価された式の値が
if-elsif-else制御式全体としての値となります。
var = if 1+1==5 then
777
end
上のコードではvarにはnilが代入されます。
Rubyのcase式には二種類あり、C言語などにあるswitch文を強化したような以下の形式や、
var = gets.to_i
filter = [5,6,7]
case var
when 1 then
puts "1"
when 2 # thenは省略可能
puts "2"
when 3,4 then
puts "3 or 4" # 複数のcaseをまとめて記述できる
when *filter then
puts "5,6 or 7"
when 8..9 then
puts "8 or 9"
else
puts "others"
end
if-elsifと同じ意味をもつ以下の形式があります。
var = gets.to_i
case
when var < 256 then puts "var is less than 256."
when var > 256 then puts "var is greater than 256."
when var == 256 then puts "var is equal to 256."
end
以下のサンプルはすべて無限ループです。
while true do # doは省略できます
puts "looping..."
end
いわゆるdo-whileです。
begin
puts "looping..."
end while true
Perlなどにあるwhile修飾子も使用できます。
puts "looping..." while true
untilも実装されています。
until false
puts "looping..."
end
for式は次のように記述します。doは省略可能です。
for i in [1,2,3,4,5] do
puts i
end
eachを用いても同じことができます。
[1,2,3,4,5].each do |i|
puts i
end
また、2次元配列を用いて次のように記述することもできます。
for i,j in [[1,-1],[2,-2]] do
puts i+j
end
break, next, redoが使用できます。
loop,times,upto,downtoなどがあります。
loop
loop do
puts "looping..."
end
loop { puts "looping..." }
times
3.times do
puts "looping..."
end
3.times{ puts "looping..."}
3.times{|i| puts "#{i}: looping..."}
upto
0.upto(10) do |i|
puts i
end
0.upto(10) {|i| puts i}
begin
# 例外が発生する可能性のある処理
1/0
rescue
# 例外が発生した場合に実行
p $! #エラー内容
ensure
# beginまたはrescueの後に必ず実行 (省略可能)
p 'inside ensure'
end
実行例
#<ZeroDivisionError: divided by 0>
"inside ensure"
begin
p Dir.exists? 'sample_dir'
Dir.rmdir 'sample_dir'
rescue Errno::ENOENT #特定のエラーを指定して捕獲できる
p $!
Dir.mkdir 'sample_dir'
retry
end
実行例
false
#<Errno::ENOENT: No such file or directory - sample_dir>
true