3. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
今日のテーマ
Ruby の制御構造
• if … elsif … else … end
• case … when … else … end
• unless … else … end
• while … end
• until … end
• for … in … do … end
手元のパソコンで確認しながら聞いてください
2
• Ruby のリテラル
• 数値リテラル
• 文字列リテラル
• 文字リテラル
• コマンド出力リテラル
• ヒアドキュメント
• 正規表現リテラル
• 配列式
• ハッシュ式
• 範囲オブジェクト
• シンボル
• %記法
4. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
if
動作
条件式の評価結果が真の場合、then 以下を評価
偽の場合 elsif を順に評価する
if の条件とすべての elsif が偽であれば else 節を評価する
if は最後に評価した結果を返す
else 節がなく、いずれの条件も不成立なら nil を返す
3
if age > 18 then
puts "adult fee"
elsif age > 12 then
puts "school children fee"
elsif age > 3 then
puts "child fee"
end
fee_type =
if age > 18
"adult fee"
elsif age > 12
"school children fee"
end
# age == 10 の場合 nil
5. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
if 修飾子、unless、unless 修飾子
if 修飾子
後置if と言う人もいる
真の場合 if の前に書いていることを評価する
偽の場合、評価しない
unless
主に unless 修飾子で使う
偽の場合に評価する。
Ruby では return と組み合わせて使うことが多い気がする
4
fee_type = "adult fee" if age > 18
fee_type ||= "school children fee" if age > 12
fee_type ||= "child fee" if age > 3
def send_mail
return unless status.success?
return unless Rails.env.production?
UserMailer.send_mail(self).deliver_now!
end
6. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
case
1つの式に対する一致判定を順に行える
一致判定は === メソッドで評価される
case の式を省略すると、 if elsif のように使える
5
case age
when 0 .. 2
"baby"
when 3 .. 6
"preschool"
when 7 .. 12
"child"
when 13 .. 18
"youth"
else
"adult"
end
case
when 0 <= age && age <= 2
"baby"
when 3 <= age && age <= 6
"preschool"
when 7 <= age && age <= 12
"child"
when 13 <= age && age <= 18
"youth"
else
"adult"
end
7. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
while、until
while:式を評価した値が真の間、繰り返し実行する
until: 評価結果が偽の間、繰り返し実行する
Ruby ではあまり使われない傾向にある
Ruby-ish でない API を使うときなどに使うことが多い
if 、unless と同様に while 修飾子、until 修飾子もある
6
transaction do
raw = connection_pool.checkout.raw_connection
raw.exec sql
while res = raw.get_result
status = res.res_status(res.result_status)
puts "Result of %s : %s" % [sql, status]
end
connection_pool.checkin(conn)
end
until f.eof?
print f.gets
end
puts f.gets until f.eof?
8. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
for、break、next
for
評価結果のオフジェクトの各要素に対して、本体を実行する
Ruby ではあまり出番はない。通常 #each を使う
変数のスコープに関して微妙に違う。
next
もっとも内側のループの次の繰り返しにジャンプする
break
もっとも内側のループを脱出する
ループ: while、until、for、イテレータ
yield 式の返り値を設定するためにあえて使うこともある
7
for line in ARGF
next if line.strip.empty?
break if line.chomp == "__END__"
puts line
end
10. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
文字列リテラル
文字列には改行を含むことができる
バックスラッシュ記法と式展開が使える
バックスラッシュ記法: ¥n が改行だけ覚えれば OK
まれに ¥u (Unicode のコードポイントの指定)も使う
式展開: #{} で任意の Ruby コードの評価結果を埋め込める
$ (グローバル変数)、@ (インスタンス変数)は {} を省略できる
9
"this is a string expression¥n"
'this is a string expression¥n'
%q!I said, "You said, 'She said it.'"!
%!I said, "You said, 'She said it.'"!
%Q('This is it.'¥n)
"this is multi line
string"
"¥u0100" #=> "Ā"
"My Ruby is #{RUBY_VERSION}" #=> "My Ruby is 2.4.1"
"This is #$0" #=> "This is irb"
13. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
ヒアドキュメント 1/3
`<<識別子' を含む行の次の行から `識別 子' だけの行
の直前までを文字列とする行指向のリテラル
12
print <<EOS
the string
next line
EOS
print <<FIRST, <<SECOND
これは一つめのヒアドキュメントです。
まだ一つめです。
FIRST
この行からは二つめのヒアドキュメントです。
この行で終わります。
SECOND
# バックスラッシュ記法、式展開が有効
print <<"EOD"
Ruby Version is #{RUBY_VERSION}
This is #$0
EOD
# バックスラッシュ記法、式展開が無効
print <<'EOD'
Ruby Version is #{RUBY_VERSION}
This is #$0
EOD
15. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
ヒアドキュメント 3/3
'<<-' で終端行のインデントができる
'<<~' で、行の先頭から空白を取り除ける
もっともインデントが少ない行を基準にして、
すべての行の先頭から空白を取り除く
14
if need_define_foo
eval <<-EOS # '<<-'
def foo
print "foo¥n"
end
EOS
#↑終端行をインデントできます。
end
expected_result = <<~SQUIGGLY_HEREDOC
This would be a special text.
That might span many lines
SQUIGGLY_HEREDOC
16. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
正規表現リテラル
正規表現はちょっと大きいテーマなので、
また回を改めて紹介します。
スキップ
15
/^Ruby the OOPL/
/Ruby/i
/my name is #{myname}/o
%r|Ruby|
/foo # コメント
bar/x
17. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
配列式
それぞれの式を評価した結果を含む配列を返す
16
[1, 2, 3]
%w(a b c)
%W(a b c)