Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 自己紹介 とみたまさひろ 富士通クラウドテクノロジーズ Nagano.rb Ginza.rb 日本MySQLユーザ会 MySQL Parameters @tmtms https://tmtms.hatenablog.com https://mysql-params.tmtms.net/ 2

Slide 3

Slide 3 text

Rubyとの関わり Rubyとの関わり 1997〜 当時は 1.1 〜2018/9 長野 Ruby で開発 2018/10〜 東京 not Ruby 最近ちょっとだけ Ruby 某P言語で書かれたプログラムを RSpec でテスト 3

Slide 4

Slide 4 text

Rubyは毎年12/25にリリース Rubyは毎年12/25にリリース 4

Slide 5

Slide 5 text

アドベントカレンダー アドベントカレンダー https://ja.wikipedia.org/wiki/アドベントカレンダー アドベントカレンダー (Advent calendar) は、クリスマ スまでの期間に日数を数えるために使用されるカレンダ ーである。待降節の期間(イエス・キリストの降誕を待 ち望む期間)に窓を毎日ひとつずつ開けていくカレンダ ーである。すべての窓を開け終わるとクリスマスを迎え たことになる。 インターネット上などで、12月の1日から25日までに、 特定のテーマに沿って毎日ブログなどに記事を投稿して いくという企画がある。元々のアドベントカレンダーに なぞらえて、この企画もアドベントカレンダーと呼ばれ ている。特にプログラミングに関連するアドベントカレ ンダーの企画が多数行われている。 5

Slide 6

Slide 6 text

Ruby 2.7 アドベントカレンダー Ruby 2.7 アドベントカレンダー https://qiita.com/advent-calendar/2019/ruby27 6

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

複数行編集 複数行編集 10

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

履歴保存 履歴保存 13

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

Numbered parameter Numbered parameter 15

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

_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

Slide 19

Slide 19 text

パターンマッチング パターンマッチング 他の言語にはあるらしい(しらない) ArrayやHashなどのオブジェクトの構造をマッチング (experimental) 19

Slide 20

Slide 20 text

Array obj = [0, [1, 2, 3]] case obj in [a, [b, *c]] p a #=> 0 p b #=> 1 p c #=> [2, 3] end 20

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

適合するパターンが無ければエラー obj = [1, "hoge"] case obj in {a: var} # 適合しない in [a, b, c] # 適合しない end #=> [1, "hoge"] (NoMatchingPatternError) 22

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

型(クラス)指定 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

Slide 26

Slide 26 text

組み込みクラスだけじゃなくて 自分でもパターン定義可能らしい 詳しくは RubyKaigi 2019 の発表を Pattern matching - New feature in Ruby 2.7 https://rubykaigi.org/2019/presentations/k_tsj.html 26

Slide 27

Slide 27 text

キーワード引数まわりのwarning キーワード引数まわりのwarning 27

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

引数 引数 引数末尾の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

Slide 31

Slide 31 text

キーワード引数 キーワード引数 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

Slide 32

Slide 32 text

その結果 その結果 def foo(hash={}, key: nil) end foo({a: 123}) # `foo': unknown keyword: :a (ArgumentError) 32

Slide 33

Slide 33 text

カオス カオス def foo(hash={}, key: nil) hash #=> {"a"=>123} key #=> 456 end h = {"a" => 123, :key => 456} foo(h) 33

Slide 34

Slide 34 text

Ruby 3 では Hash とキーワード引数を分離する予定 34

Slide 35

Slide 35 text

そのために 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

Slide 36

Slide 36 text

始端省略Rangeリテラル 始端省略Rangeリテラル 36

Slide 37

Slide 37 text

範囲オブジェクトのリテラル表記 2.6 から終端省略可能 r = (3..9) r = (3..) r.each { |i| p i } # 無限ループ 37

Slide 38

Slide 38 text

2.7 から始端省略可能 2.7 から始端省略可能 r = (..9) # イテレータとしては使えない r.each { |i| p i } # can't iterate from NilClass # 両端省略は不可 r = (..) # syntax error, unexpected ')' 38

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

コメント行を挟んだ コメント行を挟んだ メソッド呼び出し メソッド呼び出し 40

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

次の Ruby は 2020/12/25 予定 次の Ruby は 2020/12/25 予定 2.8 じゃなくて 3 かも? 2.8 じゃなくて 3 かも? 46