SlideShare a Scribd company logo
1 of 23
Download to read offline
Ruby の制御構造と
リテラルについて
2018/06/12
大手町.rb #7
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
1自己紹介
Tomoya Kawanishi a.k.a. @cuzic
エネチェンジ株式会社 チーフエンジニア
電力会社、ガス会社を切り替えるなら、エネチェンジ経由で!
一般家庭も!法人も!Ruby関西の中の人
Ruby関西の中の人
発表者として登壇くださる方、あとで声かけください。
大阪RubyKaigi01 を 7月21日に開催予定
大手町.rb の中の人
毎月 大手町.rb を第2火曜日に開催
東京駅、各線大手町駅から直結!
Ruby の初級者がメインターゲット
最近、RubyKaigi に参加してきました。
大手町.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 のリテラル
• 数値リテラル
• 文字列リテラル
• 文字リテラル
• コマンド出力リテラル
• ヒアドキュメント
• 正規表現リテラル
• 配列式
• ハッシュ式
• 範囲オブジェクト
• シンボル
• %記法
大手町.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
大手町.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
大手町.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
大手町.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?
大手町.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
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
数値リテラル
Ruby の数値リテラルは結構いろいろ書ける
桁数が多いときに _ を書けるのはとても便利
8
123 、 0d123 整数
-123 符号つき整数
123.45 浮動小数点数。
1.2e-3 浮動小数点数
0xffff 16進整数
0b1011 2進整数
0377 、 0o377 8進整数
42r 、 3.14r 有理数
42i 、 3.14i 複素数
42ri 、 3.14ri 虚数部が有理数の複素数
1_000_000_000 => 1000000000
0xffff_ffff => 0xffffffff
大手町.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"
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
文字リテラル
その文字をあらわす文字列を返すリテラル
あまり使いどころがないので、知らなくてもいい
10
?a # 文字a をあらわす String
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
コマンド出力
式展開後の文字列をコマンドとして実行
その標準出力を文字列として取得する
11
`date` #=> "2018年 6月 11日 月曜日 18:40:01 JST¥n"
`#{Rails.root + "bin/rails"} --version` #=> Rails 5.2.0
大手町.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
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
ヒアドキュメント 2/3
開始ラベル `<<識別子' が文法要素としての式
開始ラベルを使ってヒアドキュメント全体を引数に渡せる
そのままメソッドを呼び出せる
下記の例では String#upcase を呼んでいる
13
# 式の中に開始ラベルを書く
# method の第二引数には " ヒアドキュメント¥n" が渡される
method(arg1, <<LABEL, arg2)
ヒアドキュメント
LABEL
# ヒアドキュメントをレシーバにメソッドを呼ぶ
p <<LABEL.upcase
the lower case string
LABEL
大手町.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
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
正規表現リテラル
正規表現はちょっと大きいテーマなので、
また回を改めて紹介します。
スキップ
15
/^Ruby the OOPL/
/Ruby/i
/my name is #{myname}/o
%r|Ruby|
/foo # コメント
bar/x
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
配列式
それぞれの式を評価した結果を含む配列を返す
16
[1, 2, 3]
%w(a b c)
%W(a b c)
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
ハッシュ式
評価結果をキーと値とするハッシュオブジェク ト
メソッドの最後の引数の場合は {, } を省略可
[ ] の中でも上記同様に省略可
17
{ 1 => 2, 2 => 4, 3 => 6}
{ :a => "A", :b => "B", :c => "C" }
{ a: "A", b: "B", c: "C" }
# 一つ上の例と同じ。キーがシンボルの場合はこのように書ける。
{ "T-T": "A", '(^o^)': "B", "( .!. )": "C" }
#=> {:"T-T"=>"A", :"(^o^)"=>"B", :"( .!. )"=>"C"}
# 記号や空白を含むシンボルを書ける
method(1,2,3=>4) # method(1,2,{3=>4})
obj[1=>2,3=>4] # obj[{1=>2,3=>4}]
[1=>2,3=>4] # [{1=>2, 3=>4}]
task "db:seed:env" => :environment do
load(Rails.root.join('db', 'seeds', "#{Rails.env}.rb"))
end
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
範囲オブジェクト
.. で両端を含む範囲オブジェクトを返す
... で左端は含むが右端は含まない範囲オブジェクトを返す
18
(1..5).to_a #=> [1, 2, 3, 4, 5]
("1".."5").to_a #=> ["1", "2", "3", "4", "5"]
("01".."05").to_a #=> ["01", "02", "03", "04", "05"]
(1...5).to_a #=> [1, 2, 3, 4]
("1"..."5").to_a #=> ["1", "2", "3", "4"]
("01"..."05").to_a #=> ["01", "02", "03", "04"]
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
シンボル
下記のような記法で Symbol クラスのインスタンスを返す
:"…" の記法を使うことで任意のシンボルを定義可能
19
:class
:lvar
:method!
:andthisis?
:$gvar
:@ivar
:@@cvar
:+
p :'foo-bar' #=> :"foo-bar"
p :"foo-bar" #=> :"foo-bar"
p %s{foo-bar} #=> :"foo-bar"
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
%記法
%記法を使うとバックスラッシュの数を減らせ、ベンリ
括弧を区切り文字に使うと対応がとれている限り同じ括弧を使える
%W の中ではダブルクオート文字列と同じように式展開やバックスラッシュが使える
空文字列を %W の中でつかいたいときは #{} を使う
20
%!STRING! : ダブルクォート文字列
%Q!STRING! : 同上
%q!STRING! : シングルクォート文字列
%x!STRING! : コマンド出力
%r!STRING! : 正規表現
%w!STRING! : 要素が文字列の配列(空白区切り)
%W!STRING! : 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効
%s!STRING! : シンボル。式展開、バックスラッシュ記法は無効
%i!STRING! : 要素がシンボルの配列(空白区切り)
%I!STRING! : 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効
%(()) #=> "()"
%w(foo bar baz) #=> ['foo', 'bar', 'baz']
%W(foo¥ bar baz) #=> ["foo bar", "baz"]
v = "c d"
%W(a¥ b #{v}e¥sf #{}) #=> ["a b", "c de f", ""]
大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」
まとめ
今日は制御構造とリテラルについて紹介しました。
制御構造やリテラルはあまりに基本的であるがゆえに
時間をとって調べ、覚えることはないかもしれません。
うまく使いこなせれば、簡潔でより読みやすいコード
にすることができます。
すべて知っていた方はかなりの上級者だと思います。
21
ご清聴ありがとう
ございました

More Related Content

Similar to Ruby の制御構造とリテラルについて

RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Reudy on Ruby1.9
Reudy on Ruby1.9Reudy on Ruby1.9
Reudy on Ruby1.9Glass_saga
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列についてTomoya Kawanishi
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO についてTomoya Kawanishi
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Koichi Shimozono
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてTomoya Kawanishi
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Koji SHIMADA
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Rubymitim
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発についてTomoya Kawanishi
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーTomoya Kawanishi
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介Tomoya Kawanishi
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1耕平 谷口
 
第1部「一時間で覚えるruby」
第1部「一時間で覚えるruby」第1部「一時間で覚えるruby」
第1部「一時間で覚えるruby」Hiromu Shioya
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)Yuuki Namikawa
 

Similar to Ruby の制御構造とリテラルについて (20)

RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
Reudy on Ruby1.9
Reudy on Ruby1.9Reudy on Ruby1.9
Reudy on Ruby1.9
 
Ruby の文字列について
Ruby の文字列についてRuby の文字列について
Ruby の文字列について
 
RubyのDir、File、IO について
RubyのDir、File、IO についてRubyのDir、File、IO について
RubyのDir、File、IO について
 
Rake
RakeRake
Rake
 
Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発Ruby on Rails を用いたWEBアプリケーションの開発
Ruby on Rails を用いたWEBアプリケーションの開発
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Ruby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構についてRuby on Rails のキャッシュ機構について
Ruby on Rails のキャッシュ機構について
 
Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4Ruby Sapporo Night Vol4
Ruby Sapporo Night Vol4
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Pry による repl 駆動開発について
Pry による repl 駆動開発についてPry による repl 駆動開発について
Pry による repl 駆動開発について
 
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナーRuby ビジネス創出展 Ruby初心者向けプログラミングセミナー
Ruby ビジネス創出展 Ruby初心者向けプログラミングセミナー
 
Thread の利用事例紹介
Thread の利用事例紹介Thread の利用事例紹介
Thread の利用事例紹介
 
Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
C,Javaと比較しながらRubyに入門する話 - e-ZUKA Rails拡大号vol1
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
第1部「一時間で覚えるruby」
第1部「一時間で覚えるruby」第1部「一時間で覚えるruby」
第1部「一時間で覚えるruby」
 
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
大規模化するピグライフを支えるインフラ ~MongoDBとChefについて~ (後編)
 

More from Tomoya Kawanishi

ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例Tomoya Kawanishi
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウTomoya Kawanishi
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されることTomoya Kawanishi
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現についてTomoya Kawanishi
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことTomoya Kawanishi
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選Tomoya Kawanishi
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと WebクローリングについてTomoya Kawanishi
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interfaceTomoya Kawanishi
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能についてTomoya Kawanishi
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Tomoya Kawanishi
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRubyTomoya Kawanishi
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてTomoya Kawanishi
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてTomoya Kawanishi
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決についてTomoya Kawanishi
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsTomoya Kawanishi
 

More from Tomoya Kawanishi (18)

英単語の覚え方
英単語の覚え方英単語の覚え方
英単語の覚え方
 
ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例ENECHANGE社での Scout APM 利用事例
ENECHANGE社での Scout APM 利用事例
 
エンジニア転職のノウハウ
エンジニア転職のノウハウエンジニア転職のノウハウ
エンジニア転職のノウハウ
 
Ruby初心者からよく質問されること
Ruby初心者からよく質問されることRuby初心者からよく質問されること
Ruby初心者からよく質問されること
 
Ruby の正規表現について
Ruby の正規表現についてRuby の正規表現について
Ruby の正規表現について
 
AWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったことAWS のコスト管理をちゃんとしたくてやったこと
AWS のコスト管理をちゃんとしたくてやったこと
 
PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選PostgreSQL のイケてるテクニック7選
PostgreSQL のイケてるテクニック7選
 
HTTPと Webクローリングについて
HTTPと WebクローリングについてHTTPと Webクローリングについて
HTTPと Webクローリングについて
 
Active record query interface
Active record query interfaceActive record query interface
Active record query interface
 
Active Support のコア拡張機能について
Active Support のコア拡張機能についてActive Support のコア拡張機能について
Active Support のコア拡張機能について
 
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
Ruby on Rails プロジェクトでの他言語エコシステムとの共存方法
 
マークアップで使えるRuby
マークアップで使えるRubyマークアップで使えるRuby
マークアップで使えるRuby
 
エネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例についてエネチェンジでの Side ci 利用事例について
エネチェンジでの Side ci 利用事例について
 
AWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分についてAWSコストの事業部別コスト配分について
AWSコストの事業部別コスト配分について
 
Module での名前解決について
Module での名前解決についてModule での名前解決について
Module での名前解決について
 
Tsort について
Tsort についてTsort について
Tsort について
 
ガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue jsガス単独診断に学ぶ Vue js
ガス単独診断に学ぶ Vue js
 
Fiberの使いどころ
Fiberの使いどころFiberの使いどころ
Fiberの使いどころ
 

Recently uploaded

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 

Recently uploaded (8)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 

Ruby の制御構造とリテラルについて

  • 2. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も!Ruby関西の中の人 Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大阪RubyKaigi01 を 7月21日に開催予定 大手町.rb の中の人 毎月 大手町.rb を第2火曜日に開催 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット 最近、RubyKaigi に参加してきました。
  • 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
  • 9. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 数値リテラル Ruby の数値リテラルは結構いろいろ書ける 桁数が多いときに _ を書けるのはとても便利 8 123 、 0d123 整数 -123 符号つき整数 123.45 浮動小数点数。 1.2e-3 浮動小数点数 0xffff 16進整数 0b1011 2進整数 0377 、 0o377 8進整数 42r 、 3.14r 有理数 42i 、 3.14i 複素数 42ri 、 3.14ri 虚数部が有理数の複素数 1_000_000_000 => 1000000000 0xffff_ffff => 0xffffffff
  • 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"
  • 11. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 文字リテラル その文字をあらわす文字列を返すリテラル あまり使いどころがないので、知らなくてもいい 10 ?a # 文字a をあらわす String
  • 12. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 コマンド出力 式展開後の文字列をコマンドとして実行 その標準出力を文字列として取得する 11 `date` #=> "2018年 6月 11日 月曜日 18:40:01 JST¥n" `#{Rails.root + "bin/rails"} --version` #=> Rails 5.2.0
  • 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
  • 14. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 ヒアドキュメント 2/3 開始ラベル `<<識別子' が文法要素としての式 開始ラベルを使ってヒアドキュメント全体を引数に渡せる そのままメソッドを呼び出せる 下記の例では String#upcase を呼んでいる 13 # 式の中に開始ラベルを書く # method の第二引数には " ヒアドキュメント¥n" が渡される method(arg1, <<LABEL, arg2) ヒアドキュメント LABEL # ヒアドキュメントをレシーバにメソッドを呼ぶ p <<LABEL.upcase the lower case string LABEL
  • 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)
  • 18. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 ハッシュ式 評価結果をキーと値とするハッシュオブジェク ト メソッドの最後の引数の場合は {, } を省略可 [ ] の中でも上記同様に省略可 17 { 1 => 2, 2 => 4, 3 => 6} { :a => "A", :b => "B", :c => "C" } { a: "A", b: "B", c: "C" } # 一つ上の例と同じ。キーがシンボルの場合はこのように書ける。 { "T-T": "A", '(^o^)': "B", "( .!. )": "C" } #=> {:"T-T"=>"A", :"(^o^)"=>"B", :"( .!. )"=>"C"} # 記号や空白を含むシンボルを書ける method(1,2,3=>4) # method(1,2,{3=>4}) obj[1=>2,3=>4] # obj[{1=>2,3=>4}] [1=>2,3=>4] # [{1=>2, 3=>4}] task "db:seed:env" => :environment do load(Rails.root.join('db', 'seeds', "#{Rails.env}.rb")) end
  • 19. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 範囲オブジェクト .. で両端を含む範囲オブジェクトを返す ... で左端は含むが右端は含まない範囲オブジェクトを返す 18 (1..5).to_a #=> [1, 2, 3, 4, 5] ("1".."5").to_a #=> ["1", "2", "3", "4", "5"] ("01".."05").to_a #=> ["01", "02", "03", "04", "05"] (1...5).to_a #=> [1, 2, 3, 4] ("1"..."5").to_a #=> ["1", "2", "3", "4"] ("01"..."05").to_a #=> ["01", "02", "03", "04"]
  • 20. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 シンボル 下記のような記法で Symbol クラスのインスタンスを返す :"…" の記法を使うことで任意のシンボルを定義可能 19 :class :lvar :method! :andthisis? :$gvar :@ivar :@@cvar :+ p :'foo-bar' #=> :"foo-bar" p :"foo-bar" #=> :"foo-bar" p %s{foo-bar} #=> :"foo-bar"
  • 21. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 %記法 %記法を使うとバックスラッシュの数を減らせ、ベンリ 括弧を区切り文字に使うと対応がとれている限り同じ括弧を使える %W の中ではダブルクオート文字列と同じように式展開やバックスラッシュが使える 空文字列を %W の中でつかいたいときは #{} を使う 20 %!STRING! : ダブルクォート文字列 %Q!STRING! : 同上 %q!STRING! : シングルクォート文字列 %x!STRING! : コマンド出力 %r!STRING! : 正規表現 %w!STRING! : 要素が文字列の配列(空白区切り) %W!STRING! : 要素が文字列の配列(空白区切り)。式展開、バックスラッシュ記法が有効 %s!STRING! : シンボル。式展開、バックスラッシュ記法は無効 %i!STRING! : 要素がシンボルの配列(空白区切り) %I!STRING! : 要素がシンボルの配列(空白区切り)。式展開、バックスラッシュ記法が有効 %(()) #=> "()" %w(foo bar baz) #=> ['foo', 'bar', 'baz'] %W(foo¥ bar baz) #=> ["foo bar", "baz"] v = "c d" %W(a¥ b #{v}e¥sf #{}) #=> ["a b", "c de f", ""]
  • 22. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 まとめ 今日は制御構造とリテラルについて紹介しました。 制御構造やリテラルはあまりに基本的であるがゆえに 時間をとって調べ、覚えることはないかもしれません。 うまく使いこなせれば、簡潔でより読みやすいコード にすることができます。 すべて知っていた方はかなりの上級者だと思います。 21