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の 型の強さを知らない
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
すぎうり
June 23, 2026
Programming
43
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 すぎうり
BareRuby ~組み込み向けRubyAOTコンパイラ~
uproad3
0
32
AIコードアポカリプス
uproad3
0
74
負債解消という仕事は儲かる
uproad3
8
5.1k
RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~
uproad3
0
51
Rubyのメソッド解決チェーン
uproad3
0
33
動的型解析器 Ethotrace
uproad3
0
26
お前はまだRubyの 型システムを知らない
uproad3
1
110
UdonRubyの実現可能性について
uproad3
0
47
RubyKaja 2026
uproad3
0
41
Other Decks in Programming
See All in Programming
SODA - FACT BOOK(EN)
sodainc
1
200
Snowflake Openflow Connector利用の勘所 / 20261024developersio2026tokyo-snowflake-openflow
kasacchiful
PRO
0
270
AI Augmentation Techniques with Liberty
ivargrimstad
0
260
あなたの await、OS まで届いてる? strace で覗く JavaScript の非同期
hasutosasaki
1
1.8k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
500
コーディング自動化の次へ。人の介入をゼロにするファクトリーとサポートAIによる実践
timakin
5
5k
Python Lambdaにおけるテストしやすい設計とAI支援の活用 / Designing Testable Python Lambda Functions with AI
kitano_yuichi
1
270
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
260
flutter_test のその先へ — Flutter アプリの LLM 機能に「評価」という品質保証を
kosukesaigusa
0
170
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
140
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
3
1.4k
GraphQL の onError と Nullability のこれから
quramy
0
200
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
120
120k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
1.1k
Docker and Python
trallard
47
4.2k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
530
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
1
460
Balancing Empowerment & Direction
lara
6
1.4k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
290
The Curious Case for Waylosing
cassininazir
1
600
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
290
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
380
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の型の互換性を知らない