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
700
Rubyについてあれこれ / About Ruby
Nagano.rb #2 で発表したスライド
とみたまさひろ
July 20, 2019
Tweet
Share
More Decks by とみたまさひろ
See All by とみたまさひろ
夢の印税生活 / Life on Royalties
tmtms
0
310
文字列の並び順 / String Collation
tmtms
1
130
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
650
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.2k
Ruby on Browser
tmtms
1
2k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.1k
ショートカットと端末 / shortcut & terminal
tmtms
2
900
文字ときどきRuby / Character and Ruby (NSEG)
tmtms
2
2.3k
文字ときどきRuby / Character and Ruby
tmtms
0
1k
Other Decks in Technology
See All in Technology
20251014_Pythonを実務で徹底的に使いこなした話
ippei0923
0
200
[Keynote] What do you need to know about DevEx in 2025
salaboy
0
180
衛星画像超解像化によって実現する2D, 3D空間情報の即時生成と“AI as a Service”/ Real-time generation spatial data enabled_by satellite image super-resolution
lehupa
0
170
Adminaで実現するISMS/SOC2運用の効率化 〜 アカウント管理編 〜
shonansurvivors
4
450
生成AI時代のセキュアコーディングとDevSecOps
yuriemori
0
110
incident_commander_demaecan__1_.pdf
demaecan
0
140
AWSでAgentic AIを開発するための前提知識の整理
nasuvitz
2
170
物体検出モデルでシイタケの収穫時期を自動判定してみた。 #devio2025
lamaglama39
0
160
いまからでも遅くない!SSL/TLS証明書超入門(It's not too late to start! SSL/TLS Certificates: The Absolute Beginner's Guide)
norimuraz
0
250
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3k
速習AGENTS.md:5分で精度を上げる "3ブロック" テンプレ
ismk
6
1.6k
AWS IoT 超入門 2025
hattori
0
340
Featured
See All Featured
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
3.1k
Leading Effective Engineering Teams in the AI Era
addyosmani
6
450
KATA
mclloyd
32
15k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Statistics for Hackers
jakevdp
799
220k
Facilitating Awesome Meetings
lara
56
6.6k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
Code Review Best Practice
trishagee
72
19k
The Cost Of JavaScript in 2023
addyosmani
55
9k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
980
Testing 201, or: Great Expectations
jmmastey
45
7.7k
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