Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

OSS貢献者賞 2013 3

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

Ruby Ruby 7

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催 ㊗ 初の県庁所在地以外開催 長野市涙目 (;_;) https://rubykaigi.org/2020 13

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

メソッドが見つからなかった時に動くメソッド メソッドが見つからなかった時に動くメソッド 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 #

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

その他 その他 46

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

同じ動きをする別の名前のメソッド 同じ動きをする別の名前のメソッド 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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

Ruby 3 Ruby 3 55

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

おわり おわり 59