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

Rubyについてあれこれ / About Ruby

Rubyについてあれこれ / About Ruby

Nagano.rb #2 で発表したスライド

とみたまさひろ

July 20, 2019
Tweet

More Decks by とみたまさひろ

Other Decks in Technology

Transcript

  1. Rubyについてあれこれ
    Rubyについてあれこれ
    とみたまさひろ
    2019-07-20
    nagano.rb #2
    1

    View full-size slide

  2. 自己紹介
    自己紹介
    とみたまさひろ
    長野在住 / 去年から東京に単身赴任
    富士通クラウドテクノロジーズ
    日本MySQLユーザ会
    得意技: 文字化け
    @tmtms
    https://tmtms.hatenablog.com
    2

    View full-size slide

  3. OSS貢献者賞
    2013
    3

    View full-size slide

  4. 書籍執筆
    2000-2011 / 2007 / 2006
    4

    View full-size slide

  5. 雑誌寄稿
    201509 / 201606 / 201609 / 201612 / 201707
    5

    View full-size slide

  6. Ruby
    Ruby
    第一言語
    Ruby歴20数年
    Ruby/MySQL作成(1998〜)
    今はもう使われてない
    ほぼ一年Ruby書いてない…

    6

    View full-size slide

  7. 日本発
    日本発
    スクリプト言語
    スクリプト言語
    オブジェクト指向言語
    オブジェクト指向言語
    動的言語
    動的言語
    8

    View full-size slide

  8. 日本発
    日本発
    スクリプト言語
    スクリプト言語
    オブジェクト指向言語
    オブジェクト指向言語
    動的言語
    動的言語
    9

    View full-size slide

  9. 作者が日本人
    広く世界で使われている言語で
    作者が日本人というのはあんまりない
    10

    View full-size slide

  10. 日本人利用者も多い
    国内に地域Rubyコミュニティが多い
    なんとか.rb
    なんとかruby
    日本語のドキュメントが多い
    コミッターにも日本人が多い
    日本語で質問できる
    11

    View full-size slide

  11. RubyKaigi
    RubyKaigi
    世界最大の国際Rubyカンファレンス
    国内で国際カンファレンスに参加できる
    2016年から地方開催
    2016 京都市
    2017 広島市
    2018 仙台市
    2019 福岡市
    http://rubykaigi.org
    12

    View full-size slide

  12. RubyKaigi 2020
    RubyKaigi 2020
    4/9 - 11

    松本市で開催

    松本市で開催

    https://rubykaigi.org/2020
    13

    View full-size slide

  13. RubyKaigi 2020
    RubyKaigi 2020
    4/9 - 11

    松本市で開催

    松本市で開催

    初の県庁所在地以外開催
    https://rubykaigi.org/2020
    13

    View full-size slide

  14. RubyKaigi 2020
    RubyKaigi 2020
    4/9 - 11

    松本市で開催

    松本市で開催

    初の県庁所在地以外開催
    長野市涙目 (;_;)
    https://rubykaigi.org/2020
    13

    View full-size slide

  15. 何故松本?
    何故松本?
    名前繋がりという噂
    名前繋がりという噂
    14

    View full-size slide

  16. RubyKaigi 2020
    RubyKaigi 2020
    2019福岡ではなんと県知事が登壇
    長野県どーする!?
    アルクマ来ないかな
    http://www.pref.fukuoka.lg.jp/contents/rubykaigi2019.html
    15

    View full-size slide

  17. 日本発
    日本発
    スクリプト言語
    スクリプト言語
    オブジェクト指向言語
    オブジェクト指向言語
    動的言語
    動的言語
    16

    View full-size slide

  18. スクリプト言語
    スクリプト言語
    スクリプト言語とは、プログラミング
    言語のうち、プログラムの記述や実行
    を比較的簡易に行うことができる言語
    の総称である。
    https://www.weblio.jp/content/スクリプト言語
    17

    View full-size slide

  19. スクリプト言語
    スクリプト言語
    要するにプログラムを書いてサクッと実行できる
    インタプリタ
    逐次実行
    コンパイル
    実行時に内部的にコンパイルされてから実行
    明にコンパイル作業が必要なものはスクリプトとは呼ばない(たぶん)
    18

    View full-size slide

  20. インタプリタ
    インタプリタ
    文法エラーがあっても途中まで実行される
    echo 123
    echo 456 > # error
    echo 789
    % bash hoge.sh
    123
    hoge.sh: 行 3: 予期しないトークン `newline' 周辺に構文エラーがあります
    hoge.sh: 行 3: `echo 456 > # error'
    19

    View full-size slide

  21. Rubyはコンパイルしてから実行
    Rubyはコンパイルしてから実行
    文法エラーがあったら実行されない
    p 123
    p 456 _ # error
    p 789
    % ruby hoge.rb
    hoge.rb:2: syntax error, unexpected tIDENTIFIER, expecting end-
    p 456 _ # error
    20

    View full-size slide

  22. 日本発
    日本発
    スクリプト
    スクリプト
    オブジェクト指向
    オブジェクト指向
    動的
    動的
    21

    View full-size slide

  23. オブジェクト指向とは、コンピュータ
    プログラムの設計や実装についての考
    え方の一つで、互いに密接に関連する
    データと手続き(処理手順)をオブジ
    ェクト(object)と呼ばれる一つのま
    とまりとして定義し、様々なオブジェ
    クトを組み合わせて関連性や相互作用
    を記述していくことによりシステム全
    体を構築していく手法。
    http://e-words.jp/w/オブジェクト指向.html
    22

    View full-size slide

  24. オブジェクト自身ができることを知っている
    オブジェクト自身ができることを知っている
    C: オブジェクト指向でない
    Ruby: オブジェクト指向
    Rubyの「オブジェクト指向」は
    これくらいの理解でいいような気がする
    strlen("HOGE"); //=> 4
    "HOGE".length #=> 4
    23

    View full-size slide

  25. Rubyプログラムの例
    Rubyプログラムの例
    # クラス定義
    class Hoge
    # 初期化
    def initialize(arg)
    @arg = arg # インスタンス変数に引数を記憶
    end
    # 初期化時に渡された引数を表示
    def fuga
    puts @arg
    end
    end
    hoge = Hoge.new("abc") # Hogeクラスのオブジェクト生成
    hoge.fuga # "abc"が出力される
    24

    View full-size slide

  26. 言語仕様としての命名規則
    言語仕様としての命名規則
    変数の1文字目
    大文字: 定数(クラスも定数)
    「$」: グローバル変数
    「@」: インスタンス変数
    小文字や記号以外の文字:
    ローカル変数 / メソッド
    25

    View full-size slide

  27. メソッド名の末尾に「!」「?」を使用可
    メソッド名の末尾に「!」「?」を使用可
    hoge!
    ちょっと注意が必要
    破壊的メソッドとか
    hoge?
    真偽値を返す
    他の言語でisHoge()みたいな
    強制ではないけど倣っといた方が無難
    26

    View full-size slide

  28. Rubyでは値はすべてがオブジェクト
    Rubyでは値はすべてがオブジェクト
    数値 / 文字列 / シンボル / 配列
    ture / false / nil 等々
    オブジェクトではない基本型(プリミティブ型)
    というものは無い
    27

    View full-size slide

  29. オブジェクトの真偽値
    オブジェクトの真偽値
    false, nil だけが偽
    その他の値(オブジェクト)はすべて真
    0, 空文字列, 空配列等も真
    28

    View full-size slide

  30. クラスを調べる
    クラスを調べる
    123.class #=> Integer
    "Hoge".class #=> String
    :sym.class #=> Symbol
    [1,2,3].class #=> Array
    true.class #=> TrueClass
    false.class #=> FalseClass
    nil.class #=> NilClass
    29

    View full-size slide

  31. クラスもオブジェクト
    クラスもオブジェクト
    クラスはClassクラスのオブジェクト
    class B < A
    end
    B.class #=> Class
    B.superclass #=> A
    30

    View full-size slide

  32. Class.new でクラスを作れる
    Class.new でクラスを作れる
    ↑と↓は同じ
    B = Class.new(A)
    class B < A; end
    31

    View full-size slide

  33. メソッドはオブジェクトではない
    メソッドはオブジェクトではない
    残念
    def hoge
    end
    hoge # …として参照するとメソッド呼び出し
    32

    View full-size slide

  34. オブジェクト化もできる
    オブジェクト化もできる
    methodメソッドはメソッドをMethodオブジェクト化する
    m = method(:hoge)
    p m
    #=> #
    33

    View full-size slide

  35. 演算子もメソッド
    演算子もメソッド
    ↑は↓と同じ
    1 + 2 * 3 #=> 7
    1.+(2.*(3)) #=> 7
    34

    View full-size slide

  36. ブロック
    ブロック
    # 各要素に対して繰り返し
    array.each do |e|
    ...
    end
    # 指定回数繰り返し
    5.times do |i|
    ...
    end
    # ブロック終了時にファイルをクローズ
    File.open("filename.txt") do |f|
    f.read
    ...
    end
    35

    View full-size slide

  37. ブロックを受け取る側
    ブロックを受け取る側
    def each
    yield(x) # ブロックを引数xで実行
    end
    # ブロックをオブジェクトとして受け取る
    def each(&block)
    block.call(x) # ブロックを引数xで実行
    sub(&block) # 他のメソッドに渡す
    block.class #=> Proc
    end
    36

    View full-size slide

  38. Procオブジェクトの作成
    Procオブジェクトの作成
    a = proc{|a, b| ... } # 引数省略可
    b = lambda{|a, b| ... } # 引数省略不可
    c = ->(a, b){ ... } # lambda{|a, b| ... } と同じ
    5.times(&a)
    37

    View full-size slide

  39. 日本発
    日本発
    スクリプト
    スクリプト
    オブジェクト指向
    オブジェクト指向
    動的
    動的
    38

    View full-size slide

  40. 動的型つけ
    動的型つけ
    変数 / 引数 / メソッドの戻り値に型がない
    def hoge
    var = 123
    var = "hoge" if rand > 0.5
    return var
    end
    39

    View full-size slide

  41. 既存のクラスにメソッド追加
    既存のクラスにメソッド追加
    class Integer
    def hoge
    "hoge" * self
    end
    end
    5.hoge #=> "hogehogehogehogehoge"
    40

    View full-size slide

  42. 既存のメソッドを変更
    既存のメソッドを変更
    5 + 10 #=> 15
    class Integer
    def +(other)
    self * other
    end
    end
    5 + 10 #=> 50
    41

    View full-size slide

  43. class Integer
    alias orig_plus +
    def +(other)
    if rand > 0.5
    self.orig_plus(other)
    else
    self * other
    end
    end
    end
    5 + 10 #=> 15
    5 + 10 #=> 50
    5 + 10 #=> 15
    5 + 10 #=> 15
    5 + 10 #=> 50
    42

    View full-size slide

  44. クラス/メソッド定義が動的
    クラス/メソッド定義が動的
    動的にメソッド定義
    ↑と↓は同じ
    メソッド名を動的に定義できる
    class Hoge
    def hoge(p1, p2)
    end
    end
    class Hoge
    define_method(:hoge) do |p1, p2|
    end
    end
    43

    View full-size slide

  45. メソッドが見つからなかった時に動くメソッド
    メソッドが見つからなかった時に動くメソッド
    class Hoge
    def method_missing(name, *args)
    super if name == :hoge # hogeメソッドはエラー
    puts "#{name} が引数 #{args.inspect} で呼ばれた"
    end
    end
    Hoge.new.fuga(1, 2, 3)
    #=> fuga が引数 [1, 2, 3] で呼ばれた
    Hoge.new.hoge
    #=> NoMethodError (undefined method `hoge' for #44

    View full-size slide

  46. 究極の動的実行 eval
    究極の動的実行 eval
    文字列をRubyプログラムとしてその場で評価
    str = "def hoge(a, b); end"
    eval str
    45

    View full-size slide

  47. その他
    その他
    46

    View full-size slide

  48. 文字コードまわり
    文字コードまわり
    CSI - Code Set Independent
    オブジェクトごとに異なる文字コード
    文字コードまわりはRuby組み込み
    OSやライブラリに依存しない
    Unicode 12.1 対応 (Ruby 2.6.3)
    "
    ㋿".unicode_normalize(:nfkd) #=> "令和"
    47

    View full-size slide

  49. 楽しさ重視
    楽しさ重視
    Rubyの言語仕様策定において最も重視
    しているのはストレスなくプログラミ
    ングを楽しむことである (enjoy
    programming)
    https://ja.wikipedia.org/wiki/Ruby
    48

    View full-size slide

  50. 「やり方はひとつじゃない」
    「やり方はひとつじゃない」
    TMTOWTDI
    There’s More Than One Way To Do It.
    Perlのスローガン
    同じことをするのに複数の方法がある
    Rubyで明に言われているわけではない
    49

    View full-size slide

  51. 同じ動きをする別の名前のメソッド
    同じ動きをする別の名前のメソッド
    Object#to_enum, #enum_for
    Object#is_a?, #kind_of?
    Array#push, #append
    Array#length, #size
    Enumerable#map - #collect
    Enumerable#select - #find_all
    Enumerable#reduce - #inject
    などなど
    50

    View full-size slide

  52. 好きなように書ける
    好きなように書ける
    51

    View full-size slide

  53. 読みにくく書くこともできる
    読みにくく書くこともできる
    52

    View full-size slide

  54. 自由度が高い
    自由度が高い
    「自分の足を撃つ自由」
    53

    View full-size slide

  55. 自由を制約したい?
    自由を制約したい?
    Rubocop
    静的チェックツール
    主にスタイルチェック
    Metrixとかセキュリティのチェックとかも
    http://docs.rubocop.org
    54

    View full-size slide

  56. Ruby 3
    Ruby 3
    55

    View full-size slide

  57. Ruby 3x3
    Ruby 3x3
    「Ruby 3 は Ruby 2.0 より3倍速くする」
    RubyKaigi 2015 で Matz が宣言
    56

    View full-size slide

  58. 静的型チェック
    静的型チェック
    なにかしらの型チェック機構が入りそう
    RubyKaigi 2019 でもいくつか発表
    57

    View full-size slide

  59. Ruby 3
    Ruby 3
    2020/12/25 リリース
    (たぶん)
    58

    View full-size slide

  60. おわり
    おわり
    59

    View full-size slide