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

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

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

E4763acee4cf0377437f614fc372a061?s=128

とみたまさひろ

July 20, 2019
Tweet

Transcript

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

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

    @tmtms https://tmtms.hatenablog.com 2
  3. OSS貢献者賞 2013 3

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

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

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

  7. Ruby Ruby 7

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

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

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

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

  12. RubyKaigi RubyKaigi 世界最大の国際Rubyカンファレンス 国内で国際カンファレンスに参加できる 2016年から地方開催 2016 京都市 2017 広島市 2018

    仙台市 2019 福岡市 http://rubykaigi.org 12
  13. RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催

    ㊗ https://rubykaigi.org/2020 13
  14. RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催

    ㊗ 初の県庁所在地以外開催 https://rubykaigi.org/2020 13
  15. RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催

    ㊗ 初の県庁所在地以外開催 長野市涙目 (;_;) https://rubykaigi.org/2020 13
  16. 何故松本? 何故松本? 名前繋がりという噂 名前繋がりという噂 14

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

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

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

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

  21. インタプリタ インタプリタ 文法エラーがあっても途中まで実行される echo 123 echo 456 > # error

    echo 789 % bash hoge.sh 123 hoge.sh: 行 3: 予期しないトークン `newline' 周辺に構文エラーがあります hoge.sh: 行 3: `echo 456 > # error' 19
  22. 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
  23. 日本発 日本発 スクリプト スクリプト オブジェクト指向 オブジェクト指向 動的 動的 21

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

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

    4 "HOGE".length #=> 4 23
  26. 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
  27. 言語仕様としての命名規則 言語仕様としての命名規則 変数の1文字目 大文字: 定数(クラスも定数) 「$」: グローバル変数 「@」: インスタンス変数 小文字や記号以外の文字:

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

  29. Rubyでは値はすべてがオブジェクト Rubyでは値はすべてがオブジェクト 数値 / 文字列 / シンボル / 配列 ture

    / false / nil 等々 オブジェクトではない基本型(プリミティブ型) というものは無い 27
  30. オブジェクトの真偽値 オブジェクトの真偽値 false, nil だけが偽 その他の値(オブジェクト)はすべて真 0, 空文字列, 空配列等も真 28

  31. クラスを調べる クラスを調べる 123.class #=> Integer "Hoge".class #=> String :sym.class #=>

    Symbol [1,2,3].class #=> Array true.class #=> TrueClass false.class #=> FalseClass nil.class #=> NilClass 29
  32. クラスもオブジェクト クラスもオブジェクト クラスはClassクラスのオブジェクト class B < A end B.class #=>

    Class B.superclass #=> A 30
  33. Class.new でクラスを作れる Class.new でクラスを作れる ↑と↓は同じ B = Class.new(A) class B

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

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

    main.hoge> 33
  36. 演算子もメソッド 演算子もメソッド ↑は↓と同じ 1 + 2 * 3 #=> 7

    1.+(2.*(3)) #=> 7 34
  37. ブロック ブロック # 各要素に対して繰り返し array.each do |e| ... end #

    指定回数繰り返し 5.times do |i| ... end # ブロック終了時にファイルをクローズ File.open("filename.txt") do |f| f.read ... end 35
  38. ブロックを受け取る側 ブロックを受け取る側 def each yield(x) # ブロックを引数xで実行 end # ブロックをオブジェクトとして受け取る

    def each(&block) block.call(x) # ブロックを引数xで実行 sub(&block) # 他のメソッドに渡す block.class #=> Proc end 36
  39. Procオブジェクトの作成 Procオブジェクトの作成 a = proc{|a, b| ... } # 引数省略可

    b = lambda{|a, b| ... } # 引数省略不可 c = ->(a, b){ ... } # lambda{|a, b| ... } と同じ 5.times(&a) 37
  40. 日本発 日本発 スクリプト スクリプト オブジェクト指向 オブジェクト指向 動的 動的 38

  41. 動的型つけ 動的型つけ 変数 / 引数 / メソッドの戻り値に型がない def hoge var

    = 123 var = "hoge" if rand > 0.5 return var end 39
  42. 既存のクラスにメソッド追加 既存のクラスにメソッド追加 class Integer def hoge "hoge" * self end

    end 5.hoge #=> "hogehogehogehogehoge" 40
  43. 既存のメソッドを変更 既存のメソッドを変更 5 + 10 #=> 15 class Integer def

    +(other) self * other end end 5 + 10 #=> 50 41
  44. 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
  45. クラス/メソッド定義が動的 クラス/メソッド定義が動的 動的にメソッド定義 ↑と↓は同じ メソッド名を動的に定義できる class Hoge def hoge(p1, p2)

    end end class Hoge define_method(:hoge) do |p1, p2| end end 43
  46. メソッドが見つからなかった時に動くメソッド メソッドが見つからなかった時に動くメソッド 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 #<Hoge: 44
  47. 究極の動的実行 eval 究極の動的実行 eval 文字列をRubyプログラムとしてその場で評価 str = "def hoge(a, b);

    end" eval str 45
  48. その他 その他 46

  49. 文字コードまわり 文字コードまわり CSI - Code Set Independent オブジェクトごとに異なる文字コード 文字コードまわりはRuby組み込み OSやライブラリに依存しない

    Unicode 12.1 対応 (Ruby 2.6.3) " ㋿".unicode_normalize(:nfkd) #=> "令和" 47
  50. 楽しさ重視 楽しさ重視 Rubyの言語仕様策定において最も重視 しているのはストレスなくプログラミ ングを楽しむことである (enjoy programming) https://ja.wikipedia.org/wiki/Ruby 48

  51. 「やり方はひとつじゃない」 「やり方はひとつじゃない」 TMTOWTDI There’s More Than One Way To Do

    It. Perlのスローガン 同じことをするのに複数の方法がある Rubyで明に言われているわけではない 49
  52. 同じ動きをする別の名前のメソッド 同じ動きをする別の名前のメソッド 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
  53. 好きなように書ける 好きなように書ける 51

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

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

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

  57. Ruby 3 Ruby 3 55

  58. Ruby 3x3 Ruby 3x3 「Ruby 3 は Ruby 2.0 より3倍速くする」

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

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

  61. おわり おわり 59