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
1
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 すぎうり
RaspberryPi Picoの表現力の拡張 ~アナログコンピュータとの出会い~
uproad3
0
0
Rubyのメソッド解決チェーン
uproad3
0
1
動的型解析器 Ethotrace
uproad3
0
1
お前はまだRubyの 型システムを知らない
uproad3
1
47
UdonRubyの実現可能性について
uproad3
0
18
RubyKaja 2026
uproad3
0
10
VRChatでスライドを 表示する技術
uproad3
0
30
Other Decks in Programming
See All in Programming
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
220
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
240
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
350
継続モナドとリアクティブプログラミング
yukikurage
3
610
技術記事、 専門家としてのプログラマ、 言語化
mizchi
14
7.5k
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
1.1k
なぜ型を書くのか? TSKaigi2026で改めて考える #tskaigi_smarthr
kajitack
0
380
ランチタイムLT会3周年!ランチタイムLT会を3年間続けられたお話
y0hgi
1
140
Laravelで学ぶ Webアプリケーションチューニング入門/web_application_tuning_101
hanhan1978
4
800
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
1
190
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
130
AI駆動開発を妨げる技術的負債の解消アプローチ / ai-refactoring-approach
minodriven
17
9.1k
Featured
See All Featured
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
390
The browser strikes back
jonoalderson
0
1.4k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
250
Writing Fast Ruby
sferik
630
63k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Prompt Engineering for Job Search
mfonobong
0
380
Believing is Seeing
oripsolob
1
170
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
260
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
320
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の型の互換性を知らない