Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

546 views

Published on

Ruby の制御構造とリテラルについて
大手町.rb #7

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  1. 1. Ruby の制御構造と リテラルについて 2018/06/12 大手町.rb #7
  2. 2. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 1自己紹介 Tomoya Kawanishi a.k.a. @cuzic エネチェンジ株式会社 チーフエンジニア 電力会社、ガス会社を切り替えるなら、エネチェンジ経由で! 一般家庭も!法人も!Ruby関西の中の人 Ruby関西の中の人 発表者として登壇くださる方、あとで声かけください。 大阪RubyKaigi01 を 7月21日に開催予定 大手町.rb の中の人 毎月 大手町.rb を第2火曜日に開催 東京駅、各線大手町駅から直結! Ruby の初級者がメインターゲット 最近、RubyKaigi に参加してきました。
  3. 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. 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. 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. 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. 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. 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. 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. 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. 11. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 文字リテラル その文字をあらわす文字列を返すリテラル あまり使いどころがないので、知らなくてもいい 10 ?a # 文字a をあらわす String
  12. 12. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 コマンド出力 式展開後の文字列をコマンドとして実行 その標準出力を文字列として取得する 11 `date` #=> "2018年 6月 11日 月曜日 18:40:01 JST¥n" `#{Rails.root + "bin/rails"} --version` #=> Rails 5.2.0
  13. 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. 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. 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. 16. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 正規表現リテラル 正規表現はちょっと大きいテーマなので、 また回を改めて紹介します。 スキップ 15 /^Ruby the OOPL/ /Ruby/i /my name is #{myname}/o %r|Ruby| /foo # コメント bar/x
  17. 17. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 配列式 それぞれの式を評価した結果を含む配列を返す 16 [1, 2, 3] %w(a b c) %W(a b c)
  18. 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. 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. 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. 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. 22. 大手町.rb #7 発表資料 「Rubyの制御構造とリテラルについて」 まとめ 今日は制御構造とリテラルについて紹介しました。 制御構造やリテラルはあまりに基本的であるがゆえに 時間をとって調べ、覚えることはないかもしれません。 うまく使いこなせれば、簡潔でより読みやすいコード にすることができます。 すべて知っていた方はかなりの上級者だと思います。 21
  23. 23. ご清聴ありがとう ございました

×