Rubyの基本的な制御式まとめ
[履歴] [最終更新] (2014/02/02 04:13:56)
最近の投稿
注目の記事

条件分岐

if-elsif-else

以下の三つはすべて同じ意味となります。

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

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が代入されます。

case

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

以下のサンプルはすべて無限ループです。

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

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-rescue-ensure

begin
  # 例外が発生する可能性のある処理
  1/0
rescue
  # 例外が発生した場合に実行
  p $! #エラー内容
ensure
  # beginまたはrescueの後に必ず実行 (省略可能)
  p 'inside ensure'
end

実行例

#<ZeroDivisionError: divided by 0>
"inside ensure"

retry

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
関連ページ