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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
とみたまさひろ
July 20, 2019
Technology
780
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rubyについてあれこれ / About Ruby
Nagano.rb #2 で発表したスライド
とみたまさひろ
July 20, 2019
Transcript
61 slides
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
More Decks by とみたまさひろ
See All by とみたまさひろ
MySQLとPostgreSQLのコレーション / Collation of MySQL and PostgreSQL
tmtms
1
2k
文字列の並び順 / Unicode Collation
tmtms
4
1.4k
夢の印税生活 / Life on Royalties
tmtms
0
700
文字列の並び順 / String Collation
tmtms
1
300
日本MySQLユーザ会ができるまで / making MyNA
tmtms
1
1.2k
Ruby on Browser - RubyWorld Conference 2024
tmtms
1
1.7k
Ruby on Browser
tmtms
1
2.5k
私のRSpecの書き方 / How I write RSpec
tmtms
5
2.4k
ショートカットと端末 / shortcut & terminal
tmtms
2
1.1k
Other Decks in Technology
See All in Technology
ぼくのClaude Codeの使い方
falken
PRO
5
7k
Gemma4 Hands-on at Nagoya
tsho
0
100
AWS基盤改善を支える 私たちの理念と行動指針
kentosuzuki
0
220
_マネジメントする人される人ナイト_2026__良いチームを作っていきたい_お気持ち_.pdf
xkxaxkx
0
390
大江戸Ruby会議でデータベース クライアントの話をするのは 間違っているだろうか
yahonda
1
120
変更差分を読むために環境を整備しよう
pipepasta
1
250
サボる子はいねぇがー!AgentCoreハーネスの脆弱性に学ぶ、エージェントの入力バリデーション
iwamot
PRO
5
340
プロダクションコードにおける encoding/json から encoding/json/v2 へのスムーズな移行
sansantech
PRO
1
420
これからのデータエンジニアの役割について考える / Rethinking the Role of Data Engineers in the AI Era
okiyuki99
0
490
AI時代に求められる優秀なTechLeadの振る舞い
pospome
11
16k
アラートを見直していたら営業組織への理解にちょっとだけ繋がった話
z63d
1
200
[NW-JAWS DAY]「うちのAWS、インターネット出られないんで」― AWS外の自社サービスをPrivateLinkでシュッと公開する方法
ykimi
2
330
Featured
See All Featured
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
2
3k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
Building an army of robots
kneath
307
47k
How to Talk to Developers About Accessibility
jct
2
620
We Have a Design System, Now What?
morganepeng
55
8.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
The SEO Collaboration Effect
kristinabergwall1
1
620
Art, The Web, and Tiny UX
lynnandtonic
304
22k
The untapped power of vector embeddings
frankvandijk
2
2k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
320
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.7k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
600