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 2.7 新機能
    Ruby 2.7 新機能
    とみたまさひろ
    2020-02-15
    Nagano.rb #5
    #naganorb
    1

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  13. 履歴保存
    履歴保存
    13

    View full-size slide

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

    View full-size slide

  15. Numbered parameter
    Numbered parameter
    15

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide