Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Rubyについてあれこれ / About Ruby
Search
とみたまさひろ
July 20, 2019
Technology
770
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyについてあれこれ / About Ruby
Nagano.rb #2 で発表したスライド
とみたまさひろ
July 20, 2019
More Decks by とみたまさひろ
See All by とみたまさひろ
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
1.9k
文字列の並び順 / Unicode Collation
tmtms
4
1.2k
夢の印税生活 / Life on Royalties
tmtms
0
660
文字列の並び順 / String Collation
tmtms
1
270
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
1.1k
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.7k
Ruby on Browser
tmtms
1
2.4k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.3k
ショートカットと端末 / shortcut & terminal
tmtms
2
1.1k
Other Decks in Technology
See All in Technology
Snowflakeで実現する全社横断の顧客の声(VOC)分析・活用基盤@Snowflake World Tour Tokyo 2026
yuto16
0
200
enechainの内製セルフサービスプラットフォーム
hiyosi
0
170
アプリログインとWeb認証基盤をつなぐ ASWebAuthenticationSession 作法
shimastripe
1
250
AI 時代のスタートアップエコシステ厶から考究する技術的負債との向き合い方
m3m0r7
PRO
0
170
銀行勘定系システムにおける開発プロセス刷新×AIによる環境モダナイゼーション / Development Process Transformation and AI-Driven Environment Modernization
muit
0
770
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
5
25k
登壇の自信を奪う3匹のオバケ / 3 Ghosts That Rob You of Your Confidence in Public Speaking
pauli
5
440
アプリをもっと"iOSアプリっぽく"する小さな工夫 / Small Touches That Make Your App Feel More Like an iOS App
matsuji
1
740
クロスボーダーM&AのValue Upを支えるプロダクト開発。日米チームのハブになったプロダクトエンジニアの実践 / Product Engineering Conference 2026
genda
0
120
2026-09-09 【sigma_ucj#1】Sigma を IaC 管理したい! / IaC for Sigma
civitaspo
0
120
20260912_スクラムにジェネラリストは必要か
ryugen04
0
380
AI時代のAPI品質を支えるガードレール / API Guardrails for API quality in the AI era
yokawasa
1
220
Featured
See All Featured
Prompt Engineering for Job Search
mfonobong
0
450
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
700
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
830
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
820
The World Runs on Bad Software
bkeepers
PRO
72
12k
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
670
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
280
The untapped power of vector embeddings
frankvandijk
2
1.9k
Odyssey Design
rkendrick25
PRO
2
800
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