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
すぎうり
June 23, 2026
Programming
18
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 すぎうり
AIコードアポカリプス
uproad3
0
29
負債解消という仕事は儲かる
uproad3
6
3.8k
RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~
uproad3
0
16
Rubyのメソッド解決チェーン
uproad3
0
15
動的型解析器 Ethotrace
uproad3
0
9
お前はまだRubyの 型システムを知らない
uproad3
1
56
UdonRubyの実現可能性について
uproad3
0
25
RubyKaja 2026
uproad3
0
19
VRChatでスライドを 表示する技術
uproad3
0
38
Other Decks in Programming
See All in Programming
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
370
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
220
Android CLI
fornewid
0
210
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.6k
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
210
『コードを書く以外の』エンジニアリング〜課金基盤移行プロジェクト推進のためのTips4選
yuriko1211
0
590
Cloudflare is Agents
chimame
0
150
AI Engineeringは、AIプロダクトだけのものか? 〜AIがソフトウェアを作る時代の新しい当たり前〜 / No AI in your product. AI Engineering in your development.
rkaga
4
380
「人を評価する AI」の設計と実装
ryoyanara
0
180
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
450
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.7k
Terraform標準の組織で AWS CDKをどう使うか
mu7889yoon
1
490
Featured
See All Featured
New Earth Scene 8
popppiees
3
2.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
450
The Spectacular Lies of Maps
axbom
PRO
1
890
Practical Orchestrator
shlominoach
191
12k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.2k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
200
Skip the Path - Find Your Career Trail
mkilby
1
180
A Soul's Torment
seathinner
6
3.4k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
440
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の型の互換性を知らない