Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Ruby 2.7 新機能 / Ruby 27 features

Ruby 2.7 新機能 / Ruby 27 features

とみたまさひろ

February 15, 2020
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

  1. Rubyとの関わり Rubyとの関わり 1997〜 当時は 1.1 〜2018/9 長野 Ruby で開発 2018/10〜

    東京 not Ruby 最近ちょっとだけ Ruby 某P言語で書かれたプログラムを RSpec でテスト 3
  2. アドベントカレンダー アドベントカレンダー https://ja.wikipedia.org/wiki/アドベントカレンダー アドベントカレンダー (Advent calendar) は、クリスマ スまでの期間に日数を数えるために使用されるカレンダ ーである。待降節の期間(イエス・キリストの降誕を待 ち望む期間)に窓を毎日ひとつずつ開けていくカレンダ

    ーである。すべての窓を開け終わるとクリスマスを迎え たことになる。 インターネット上などで、12月の1日から25日までに、 特定のテーマに沿って毎日ブログなどに記事を投稿して いくという企画がある。元々のアドベントカレンダーに なぞらえて、この企画もアドベントカレンダーと呼ばれ ている。特にプログラミングに関連するアドベントカレ ンダーの企画が多数行われている。 5
  3. _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
  4. Array obj = [0, [1, 2, 3]] case obj in

    [a, [b, *c]] p a #=> 0 p b #=> 1 p c #=> [2, 3] end 20
  5. 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
  6. 適合するパターンが無ければエラー obj = [1, "hoge"] case obj in {a: var}

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

    # 適合しない in [a, b, c] # 適合しない else "no match" end #=> "no match" 23
  8. 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
  9. 型(クラス)指定 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
  10. 引数 引数 引数末尾の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
  11. キーワード引数 キーワード引数 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
  12. その結果 その結果 def foo(hash={}, key: nil) end foo({a: 123}) #

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

    #=> 456 end h = {"a" => 123, :key => 456} foo(h) 33
  14. そのために 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
  15. 2.7 から始端省略可能 2.7 から始端省略可能 r = (..9) # イテレータとしては使えない r.each

    { |i| p i } # can't iterate from NilClass # 両端省略は不可 r = (..) # syntax error, unexpected ')' 38
  16. 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
  17. 次の Ruby は 2020/12/25 予定 次の Ruby は 2020/12/25 予定

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