Save 37% off PRO during our Black Friday Sale! »

Ruby 2.7 新機能 / Ruby 27 features

Ruby 2.7 新機能 / Ruby 27 features

E4763acee4cf0377437f614fc372a061?s=128

とみたまさひろ

February 15, 2020
Tweet

Transcript

  1. Ruby 2.7 新機能 Ruby 2.7 新機能 とみたまさひろ 2020-02-15 Nagano.rb #5

    #naganorb 1
  2. 自己紹介 自己紹介 とみたまさひろ 富士通クラウドテクノロジーズ Nagano.rb Ginza.rb 日本MySQLユーザ会 MySQL Parameters @tmtms

    https://tmtms.hatenablog.com https://mysql-params.tmtms.net/ 2
  3. Rubyとの関わり Rubyとの関わり 1997〜 当時は 1.1 〜2018/9 長野 Ruby で開発 2018/10〜

    東京 not Ruby 最近ちょっとだけ Ruby 某P言語で書かれたプログラムを RSpec でテスト 3
  4. Rubyは毎年12/25にリリース Rubyは毎年12/25にリリース 4

  5. アドベントカレンダー アドベントカレンダー https://ja.wikipedia.org/wiki/アドベントカレンダー アドベントカレンダー (Advent calendar) は、クリスマ スまでの期間に日数を数えるために使用されるカレンダ ーである。待降節の期間(イエス・キリストの降誕を待 ち望む期間)に窓を毎日ひとつずつ開けていくカレンダ

    ーである。すべての窓を開け終わるとクリスマスを迎え たことになる。 インターネット上などで、12月の1日から25日までに、 特定のテーマに沿って毎日ブログなどに記事を投稿して いくという企画がある。元々のアドベントカレンダーに なぞらえて、この企画もアドベントカレンダーと呼ばれ ている。特にプログラミングに関連するアドベントカレ ンダーの企画が多数行われている。 5
  6. Ruby 2.7 アドベントカレンダー Ruby 2.7 アドベントカレンダー https://qiita.com/advent-calendar/2019/ruby27 6

  7. Ruby 2.7 新機能など Ruby 2.7 新機能など 7

  8. irb irb 対話型Ruby Ruby 2.7 で大幅に機能向上 8

  9. リアルタイムのコードハイライト リアルタイムのコードハイライト 9

  10. 複数行編集 複数行編集 10

  11. メソッド補完 メソッド補完 11

  12. マニュアル表示 マニュアル表示 12

  13. 履歴保存 履歴保存 13

  14. しかし遅い しかし遅い 入力1文字毎に処理してるため きっとそのうち改善される 14

  15. Numbered parameter Numbered parameter 15

  16. ブロック引数には名前をつける必要があった [5, 2, 4, 1, 3].sort { |a, b| a

    <=> b } #=> [1, 2, 3, 16
  17. いちいち名前を考えなくてもいい場合 _+数字(1〜9) を使えるようになった [5, 2, 4, 1, 3].sort { _1

    <=> _2 } #=> [1, 2, 3, 4, 5 17
  18. _1, _2, … は今までローカル変数だったので 混在させると warning _2 = 99 [5,

    2, 4, 1, 3].sort { _1 <=> _2 } #=> [5, 2, 4, 1, 3 # warning: `_2' is reserved for numbered parameter; # consider another name 18
  19. パターンマッチング パターンマッチング 他の言語にはあるらしい(しらない) ArrayやHashなどのオブジェクトの構造をマッチング (experimental) 19

  20. Array obj = [0, [1, 2, 3]] case obj in

    [a, [b, *c]] p a #=> 0 p b #=> 1 p c #=> [2, 3] end 20
  21. Hash obj = {a: 0, b: 1, c: 2} case

    obj in {a: 0, x: 1} # ここは通らない in {a: 0, b: var} p var #=> 1 end 21
  22. 適合するパターンが無ければエラー obj = [1, "hoge"] case obj in {a: var}

    # 適合しない in [a, b, c] # 適合しない end #=> [1, "hoge"] (NoMatchingPatternError) 22
  23. elseも書ける obj = [1, "hoge"] case obj in {a: var}

    # 適合しない in [a, b, c] # 適合しない else "no match" end #=> "no match" 23
  24. ifで条件指定も def hoge(obj) case obj in [a, b] if a

    == b.to_i true else false end end hoge [123, "123"] #=> true hoge [123, "456"] #=> false hoge "xxxx" #=> false 24
  25. 型(クラス)指定 def hoge(obj) case obj in [String => s, Integer

    => n] s * n in [a, b] a + b end end hoge ["abc", 2] #=> "abcabc" hoge [3, 4] #=> 7 25
  26. 組み込みクラスだけじゃなくて 自分でもパターン定義可能らしい 詳しくは RubyKaigi 2019 の発表を Pattern matching - New

    feature in Ruby 2.7 https://rubykaigi.org/2019/presentations/k_tsj.html 26
  27. キーワード引数まわりのwarning キーワード引数まわりのwarning 27

  28. Rubyのキーワード引数はHashの表記を使用 28

  29. Hash Hash キーがシンボルの場合 (Ruby 1.9〜) {:hoge => 123, :fuga =>

    456} {hoge: 123, fuga: 456} 29
  30. 引数 引数 引数末尾のHashは { } を省略可 キーワード引数っぽい def foo(a, b,

    opts) a #=> 1 b #=> 2 opts #=> {hoge: 123, fuga: 456} end foo(1, 2, {hoge: 123, fuga: 456}) def foo(a, b, opts) a #=> 1 b #=> 2 opts #=> {hoge: 123, fuga: 456} end foo(1, 2, hoge: 123, fuga: 456) 30
  31. キーワード引数 キーワード引数 Ruby 2.0〜 def foo(a, b, hoge: nil, fuga:

    nil) a #=> 1 b #=> 2 hoge #=> 123 fuga #=> 456 end foo(1, 2, hoge: 123, fuga: 456) 31
  32. その結果 その結果 def foo(hash={}, key: nil) end foo({a: 123}) #

    `foo': unknown keyword: :a (ArgumentError) 32
  33. カオス カオス def foo(hash={}, key: nil) hash #=> {"a"=>123} key

    #=> 456 end h = {"a" => 123, :key => 456} foo(h) 33
  34. Ruby 3 では Hash とキーワード引数を分離する予定 34

  35. そのために 2.7 で warning def foo(hash={}, key: nil) end h

    = {:key => 456} foo(h) # warning: Using the last argument as keyword paramete # deprecated; maybe ** should be added to the call def foo(hash={}, key: nil) end h = {"a" => 123, :key => 456} foo(h) # warning: Splitting the last argument into positional # and keyword parameters is deprecated 35
  36. 始端省略Rangeリテラル 始端省略Rangeリテラル 36

  37. 範囲オブジェクトのリテラル表記 2.6 から終端省略可能 r = (3..9) r = (3..) r.each

    { |i| p i } # 無限ループ 37
  38. 2.7 から始端省略可能 2.7 から始端省略可能 r = (..9) # イテレータとしては使えない r.each

    { |i| p i } # can't iterate from NilClass # 両端省略は不可 r = (..) # syntax error, unexpected ')' 38
  39. DSL的な使用 DSL的な使用 require 'sequel' db = Sequel::Database.new db[:table].where(col: 3..9).sql #=>

    SELECT * FROM table WHERE ((col >= 3) AND (col <= db[:table].where(col: 3..).sql #=> SELECT * FROM table WHERE (col >= 3) db[:table].where(col: ..9).sql #=> SELECT * FROM table WHERE (col <= 9) 39
  40. コメント行を挟んだ コメント行を挟んだ メソッド呼び出し メソッド呼び出し 40

  41. メソッド呼び出しは . の前後で改行可能 "hoge".upcase "hoge". upcase "hoge" .upcase 41

  42. . 終わりの行の後にコメント行を挟む 2.7からはこっちも可能 "hoge". # コメント upcase "hoge" # コメント

    .upcase 42
  43. GC.compact GC.compact フラグメント化したメモリを再配置 「GC」? 長時間動き続けるプロセスで 肥大化したプロセスメモリを小さくできるかも 43

  44. Date.jisx0301 の令和対応 Date.jisx0301 の令和対応 require 'date' Date.today.jisx0301 #=> "R02.02.15" 44

  45. 以上 以上 「プロと読み解くRuby 2.7 NEWS」 https://techlife.cookpad.com/entry/2019/12/25/121834 45

  46. 次の Ruby は 2020/12/25 予定 次の Ruby は 2020/12/25 予定

    2.8 じゃなくて 3 かも? 2.8 じゃなくて 3 かも? 46