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の 型の強さを知らない
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
すぎうり
June 23, 2026
Programming
0
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
お前はまだRubyの 型の強さを知らない
すぎうり
June 23, 2026
More Decks by すぎうり
See All by すぎうり
Rubyのメソッド解決チェーン
uproad3
0
0
動的型解析器 Ethotrace
uproad3
0
0
お前はまだRubyの 型システムを知らない
uproad3
1
44
UdonRubyの実現可能性について
uproad3
0
15
RubyKaja 2026
uproad3
0
7
VRChatでスライドを 表示する技術
uproad3
0
17
Other Decks in Programming
See All in Programming
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
300
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
280
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
220
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
5.4k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
560
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
130
Vite+ Unified Toolchain for the Web
naokihaba
0
340
Performance Engineering for Everyone
elenatanasoiu
0
210
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
13
6.2k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
150
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
120
IBM Bobを活用したレガシーアプリの最新化
oniak3ibm
PRO
1
210
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.3k
Six Lessons from altMBA
skipperchong
29
4.3k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
Done Done
chrislema
186
16k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
Docker and Python
trallard
47
3.9k
Skip the Path - Find Your Career Trail
mkilby
1
150
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
The Curious Case for Waylosing
cassininazir
1
400
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
240
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
420
Transcript
お前はまだ Rubyの 型の強さを知らない すぎうり Rubyの型シリーズ#2
自己紹介 すぎうり • Twitter:@uproad3 • Ruby歴20年 • VRChat歴7年 • 仕事:Rails |
AWS | LT芸人 • 趣味:アーキテクト | リファクタリング | 電子工作 • 言語:Ruby | C# | C | JS | ほかいろいろ • 技術:Terraform | Unity | Ubuntu | MySQL | RaspberryPi • 悲しきフルスタックエンジニア • 最近はClaudeをシバきまわしている • 特に型に強い思い入れがあるわけではない
前回のおさらい 「Rubyには型がない」 ↓ 「Rubyには型注釈がないだけ」 型検査・型強度・型互換・型変性・ポリモーフィズム... Rubyには型システムがちゃんとある
補足 このシリーズにおける型とは”インスタンス ”の型 変数はすべて型なし(あえて言うならインスタンス型) Rubyの世界では値はすべてインスタンス
型の強さとは 強い型 暗黙的型変換をする 勝手に型を合わせてくれる 便利だけど予測が難しい 弱い型 暗黙的型変換をしない 型が合わなければエラー 意図が明確になる
暗黙的型変換をする言語 JavaScript 1 + "2" // => "12" ← 数値が文字列に化ける
C言語 int i = 1; float f = 2.5; float result = i + f; // int が暗黙的に float に昇格 → 便利だが、意図しない変換が潜む
Rubyは変換しない 3 + '1' # => TypeError: String can't be
coerced into Integer Rubyは黙って変換しない。おかしければ怒る。 これが「型の強さ」 変換したいなら明示的に: 3 + '1'.to_i # => 4 3.to_s + '1' # => '31'
前提:’+’は実はメソッド呼び出し Rubyの演算子は「メソッド」として定義されている # 1 + 2 は実はこういうこと 1.+(2) # =>
3 # 自分で定義もできる class MyVal def +(other) MyVal.new(@val + other.val) end end
String#+ は相手の to_str を呼ぶ コード例 # to_str なし → TypeError
class MyStr def initialize(s); @s = s; end end "Hello " + MyStr.new("world") # => TypeError # to_str あり → 成功 class MyStr def to_str; @s; end end "Hello " + MyStr.new("world") # => "Hello world" String#+ の擬似コード def +(other) if other.respond_to?(:to_str) # to_str を呼んで文字列化 concat(other.to_str) else raise TypeError, "no implicit conversion" end end ※ 実際はC実装。Ruby擬似コードに変換
Numeric#+ は相手の coerce を呼ぶ コード例 class Money def initialize(v); @v
= v; end def coerce(other) [Money.new(other), self] end def +(other) Money.new(@v + other.to_i) end end 2 + Money.new(100) # => Money(102) Numeric#+ の擬似コード def +(other) # 同じ型なら直接計算 return numeric_add(other) if other.is_a?(Numeric) # 異なる型は coerce を期待 x, y = other.coerce(self) x + y rescue TypeError raise TypeError, "can't coerce" end ※ 実際はC実装。Ruby擬似コードに変換
Rubyは相手が変換方法を知っていることを期待する String#+ to_str を持ってる? 持っていれば文字列 として扱う 持っていなければ TypeError Numeric#+ coerce
を持ってる? 持っていれば演算可 能として扱う 持っていなければ TypeError 共通の思想 暗黙的に変換しない 変換方法を知って いるかを確かめて から使う 型は強い。でも、変換方法を提供できる ——これがRubyの「開かれた強さ」
まとめ Rubyの型は「強い」 型が合わなければ TypeError で落とす 変換メソッドの呼び出し(to_str, coerce) + ダックタイピング → 暗黙的型変換をしない
→ 意図を明示することがRubyの流儀 → 既存の型に型演算を追加できる
次回 お前はまだ Rubyの型の互換性を知らない