目次
Rubyを使った効率的なスクリプトの書き方を紹介
条件分岐
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内あるいは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
記事の執筆者にステッカーを贈る
有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。
さらに詳しく →Feedbacks
ログインするとコメントを投稿できます。
関連記事
- レイアウトおよび部分テンプレートに関するまとめ (Rails4)レイアウトおよび部分テンプレートはどちらもテンプレート (*.html.erb) に共通の要素をまとめておき、任意のテンプレートから利用できるようにしておくための仕組みです。フッターやヘッダーといった大枠はレイアウト、小さなパーツは部分テンプレートというイメージで使い分けましょう。 レイアウトの使用方法 クラス毎に指定する方法と、アクション毎に指定する方法があります。 app/views/layo...
- Ruby コードスニペット (正規表現)sample.rb str = "001: This is a string." var1,var2 = 2,3 # 'EOS'とすると#{}による変数展開がなされない (%03dは展開される) doc = (<<"EOS" % var1) # 括弧は省略可。要は<<"EOS"の次の行からEOSまで。(参: <<-"EOS"とすると前に空白...
- OAuthを用いずにTwitterに自動投稿する (回数制限あり, Selenium with Ruby)Seleniumを用いて、OAuthを用いずにTwitterに自動投稿するRubyスクリプトを記述してみます。連続で複数回実行すると、ボット判定としてキャプチャ認証が発生します。その認証までは通過できませんので悪しからず。また、Twitterの仕様変更次第ではDOMの構造が変化するため、下記サンプルは機能しなくなる恐れが有ります。 twitter_post.rb #!/usr/bin/ruby r...
- Ruby における日本語のエンコーディング日本語を含めて多言語対応する際には、Asciiコード以外の文字コードセットが必要になります。日本語が主となる場合、よく使われる文字セットにはUnicode, Shift_JIS, EUC-JPがあります。このうち Unicode だけは特殊であり、世界中のあらゆる文字を収録しようとしていることから 1 文字を表現するために必要なバイト数が大きくなってしまっています。そのため Unicode のうち...
- Rails3ビューテンプレートの基本的な使用方法 (Ruby)Railsでは、ERB (eRuby (テキストファイルにRubyスクリプトを埋込む書式の仕様) をRubyで実装したもの) を用いてHTML内にRubyスクリプトを埋込むことができます。 <% %> で囲むと出力されません (if-elseなど制御構文を記述します) <%= %> で囲むとエスケープ出力されます <%== %> で囲むとエスケープされずに...