Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rubyについてあれこれ / About Ruby
Search
とみたまさひろ
July 20, 2019
Technology
0
570
Rubyについてあれこれ / About Ruby
Nagano.rb #2 で発表したスライド
とみたまさひろ
July 20, 2019
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
Ruby on Browser
tmtms
1
1.2k
私のRSpecの書き方 / How I write RSpec
tmtms
5
1.4k
ショートカットと端末 / shortcut & terminal
tmtms
2
360
文字ときどきRuby / Character and Ruby (NSEG)
tmtms
2
1.6k
文字ときどきRuby / Character and Ruby
tmtms
0
480
Linux用キーリマッパーを作る技術 / How to make Key Remapper
tmtms
0
380
MIMEヘッダエンコーディングは複雑すぎてつらい / MIME header encoding is hard
tmtms
3
1.4k
Net::SMTP
tmtms
1
290
MySQL Parameters の裏側 / MySQL Parameters backend
tmtms
1
430
Other Decks in Technology
See All in Technology
OCI Vault 概要
oracle4engineer
PRO
0
9.7k
AIチャットボット開発への生成AI活用
ryomrt
0
170
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
FlutterアプリにおけるSLI/SLOを用いたユーザー体験の可視化と計測基盤構築
ostk0069
0
100
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
300
アプリエンジニアのためのGraphQL入門.pdf
spycwolf
0
100
Zennのパフォーマンスモニタリングでやっていること
ryosukeigarashi
0
160
Incident Response Practices: Waroom's Features and Future Challenges
rrreeeyyy
0
160
強いチームと開発生産性
onk
PRO
35
11k
TypeScriptの次なる大進化なるか!? 条件型を返り値とする関数の型推論
uhyo
2
1.7k
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
オープンソースAIとは何か? --「オープンソースAIの定義 v1.0」詳細解説
shujisado
10
1.1k
Featured
See All Featured
Build your cross-platform service in a week with App Engine
jlugia
229
18k
What's in a price? How to price your products and services
michaelherold
243
12k
Making Projects Easy
brettharned
115
5.9k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
A Tale of Four Properties
chriscoyier
156
23k
Put a Button on it: Removing Barriers to Going Fast.
kastner
59
3.5k
Visualization
eitanlees
145
15k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
Speed Design
sergeychernyshev
25
620
Transcript
Rubyについてあれこれ Rubyについてあれこれ とみたまさひろ 2019-07-20 nagano.rb #2 1
自己紹介 自己紹介 とみたまさひろ 長野在住 / 去年から東京に単身赴任 富士通クラウドテクノロジーズ 日本MySQLユーザ会 得意技: 文字化け
@tmtms https://tmtms.hatenablog.com 2
OSS貢献者賞 2013 3
書籍執筆 2000-2011 / 2007 / 2006 4
雑誌寄稿 201509 / 201606 / 201609 / 201612 / 201707
5
Ruby Ruby 第一言語 Ruby歴20数年 Ruby/MySQL作成(1998〜) 今はもう使われてない ほぼ一年Ruby書いてない… 6
Ruby Ruby 7
日本発 日本発 スクリプト言語 スクリプト言語 オブジェクト指向言語 オブジェクト指向言語 動的言語 動的言語 8
日本発 日本発 スクリプト言語 スクリプト言語 オブジェクト指向言語 オブジェクト指向言語 動的言語 動的言語 9
作者が日本人 広く世界で使われている言語で 作者が日本人というのはあんまりない 10
日本人利用者も多い 国内に地域Rubyコミュニティが多い なんとか.rb なんとかruby 日本語のドキュメントが多い コミッターにも日本人が多い 日本語で質問できる 11
RubyKaigi RubyKaigi 世界最大の国際Rubyカンファレンス 国内で国際カンファレンスに参加できる 2016年から地方開催 2016 京都市 2017 広島市 2018
仙台市 2019 福岡市 http://rubykaigi.org 12
RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催
㊗ https://rubykaigi.org/2020 13
RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催
㊗ 初の県庁所在地以外開催 https://rubykaigi.org/2020 13
RubyKaigi 2020 RubyKaigi 2020 4/9 - 11 松本市で開催 ㊗ 松本市で開催
㊗ 初の県庁所在地以外開催 長野市涙目 (;_;) https://rubykaigi.org/2020 13
何故松本? 何故松本? 名前繋がりという噂 名前繋がりという噂 14
RubyKaigi 2020 RubyKaigi 2020 2019福岡ではなんと県知事が登壇 長野県どーする!? アルクマ来ないかな http://www.pref.fukuoka.lg.jp/contents/rubykaigi2019.html 15
日本発 日本発 スクリプト言語 スクリプト言語 オブジェクト指向言語 オブジェクト指向言語 動的言語 動的言語 16
スクリプト言語 スクリプト言語 スクリプト言語とは、プログラミング 言語のうち、プログラムの記述や実行 を比較的簡易に行うことができる言語 の総称である。 https://www.weblio.jp/content/スクリプト言語 17
スクリプト言語 スクリプト言語 要するにプログラムを書いてサクッと実行できる インタプリタ 逐次実行 コンパイル 実行時に内部的にコンパイルされてから実行 明にコンパイル作業が必要なものはスクリプトとは呼ばない(たぶん) 18
インタプリタ インタプリタ 文法エラーがあっても途中まで実行される echo 123 echo 456 > # error
echo 789 % bash hoge.sh 123 hoge.sh: 行 3: 予期しないトークン `newline' 周辺に構文エラーがあります hoge.sh: 行 3: `echo 456 > # error' 19
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
日本発 日本発 スクリプト スクリプト オブジェクト指向 オブジェクト指向 動的 動的 21
オブジェクト指向とは、コンピュータ プログラムの設計や実装についての考 え方の一つで、互いに密接に関連する データと手続き(処理手順)をオブジ ェクト(object)と呼ばれる一つのま とまりとして定義し、様々なオブジェ クトを組み合わせて関連性や相互作用 を記述していくことによりシステム全 体を構築していく手法。 http://e-words.jp/w/オブジェクト指向.html
22
オブジェクト自身ができることを知っている オブジェクト自身ができることを知っている C: オブジェクト指向でない Ruby: オブジェクト指向 Rubyの「オブジェクト指向」は これくらいの理解でいいような気がする strlen("HOGE"); //=>
4 "HOGE".length #=> 4 23
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
言語仕様としての命名規則 言語仕様としての命名規則 変数の1文字目 大文字: 定数(クラスも定数) 「$」: グローバル変数 「@」: インスタンス変数 小文字や記号以外の文字:
ローカル変数 / メソッド 25
メソッド名の末尾に「!」「?」を使用可 メソッド名の末尾に「!」「?」を使用可 hoge! ちょっと注意が必要 破壊的メソッドとか hoge? 真偽値を返す 他の言語でisHoge()みたいな 強制ではないけど倣っといた方が無難 26
Rubyでは値はすべてがオブジェクト Rubyでは値はすべてがオブジェクト 数値 / 文字列 / シンボル / 配列 ture
/ false / nil 等々 オブジェクトではない基本型(プリミティブ型) というものは無い 27
オブジェクトの真偽値 オブジェクトの真偽値 false, nil だけが偽 その他の値(オブジェクト)はすべて真 0, 空文字列, 空配列等も真 28
クラスを調べる クラスを調べる 123.class #=> Integer "Hoge".class #=> String :sym.class #=>
Symbol [1,2,3].class #=> Array true.class #=> TrueClass false.class #=> FalseClass nil.class #=> NilClass 29
クラスもオブジェクト クラスもオブジェクト クラスはClassクラスのオブジェクト class B < A end B.class #=>
Class B.superclass #=> A 30
Class.new でクラスを作れる Class.new でクラスを作れる ↑と↓は同じ B = Class.new(A) class B
< A; end 31
メソッドはオブジェクトではない メソッドはオブジェクトではない 残念 def hoge end hoge # …として参照するとメソッド呼び出し 32
オブジェクト化もできる オブジェクト化もできる methodメソッドはメソッドをMethodオブジェクト化する m = method(:hoge) p m #=> #<Method:
main.hoge> 33
演算子もメソッド 演算子もメソッド ↑は↓と同じ 1 + 2 * 3 #=> 7
1.+(2.*(3)) #=> 7 34
ブロック ブロック # 各要素に対して繰り返し array.each do |e| ... end #
指定回数繰り返し 5.times do |i| ... end # ブロック終了時にファイルをクローズ File.open("filename.txt") do |f| f.read ... end 35
ブロックを受け取る側 ブロックを受け取る側 def each yield(x) # ブロックを引数xで実行 end # ブロックをオブジェクトとして受け取る
def each(&block) block.call(x) # ブロックを引数xで実行 sub(&block) # 他のメソッドに渡す block.class #=> Proc end 36
Procオブジェクトの作成 Procオブジェクトの作成 a = proc{|a, b| ... } # 引数省略可
b = lambda{|a, b| ... } # 引数省略不可 c = ->(a, b){ ... } # lambda{|a, b| ... } と同じ 5.times(&a) 37
日本発 日本発 スクリプト スクリプト オブジェクト指向 オブジェクト指向 動的 動的 38
動的型つけ 動的型つけ 変数 / 引数 / メソッドの戻り値に型がない def hoge var
= 123 var = "hoge" if rand > 0.5 return var end 39
既存のクラスにメソッド追加 既存のクラスにメソッド追加 class Integer def hoge "hoge" * self end
end 5.hoge #=> "hogehogehogehogehoge" 40
既存のメソッドを変更 既存のメソッドを変更 5 + 10 #=> 15 class Integer def
+(other) self * other end end 5 + 10 #=> 50 41
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
クラス/メソッド定義が動的 クラス/メソッド定義が動的 動的にメソッド定義 ↑と↓は同じ メソッド名を動的に定義できる class Hoge def hoge(p1, p2)
end end class Hoge define_method(:hoge) do |p1, p2| end end 43
メソッドが見つからなかった時に動くメソッド メソッドが見つからなかった時に動くメソッド 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
究極の動的実行 eval 究極の動的実行 eval 文字列をRubyプログラムとしてその場で評価 str = "def hoge(a, b);
end" eval str 45
その他 その他 46
文字コードまわり 文字コードまわり CSI - Code Set Independent オブジェクトごとに異なる文字コード 文字コードまわりはRuby組み込み OSやライブラリに依存しない
Unicode 12.1 対応 (Ruby 2.6.3) " ㋿".unicode_normalize(:nfkd) #=> "令和" 47
楽しさ重視 楽しさ重視 Rubyの言語仕様策定において最も重視 しているのはストレスなくプログラミ ングを楽しむことである (enjoy programming) https://ja.wikipedia.org/wiki/Ruby 48
「やり方はひとつじゃない」 「やり方はひとつじゃない」 TMTOWTDI There’s More Than One Way To Do
It. Perlのスローガン 同じことをするのに複数の方法がある Rubyで明に言われているわけではない 49
同じ動きをする別の名前のメソッド 同じ動きをする別の名前のメソッド 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
好きなように書ける 好きなように書ける 51
読みにくく書くこともできる 読みにくく書くこともできる 52
自由度が高い 自由度が高い 「自分の足を撃つ自由」 53
自由を制約したい? 自由を制約したい? Rubocop 静的チェックツール 主にスタイルチェック Metrixとかセキュリティのチェックとかも http://docs.rubocop.org 54
Ruby 3 Ruby 3 55
Ruby 3x3 Ruby 3x3 「Ruby 3 は Ruby 2.0 より3倍速くする」
RubyKaigi 2015 で Matz が宣言 56
静的型チェック 静的型チェック なにかしらの型チェック機構が入りそう RubyKaigi 2019 でもいくつか発表 57
Ruby 3 Ruby 3 2020/12/25 リリース (たぶん) 58
おわり おわり 59