はじめに
2025年12月25日に、Rubyの新しいバージョンであるRuby 4.0がリリースされました。
一方、2021年12月2日に出版した書籍「プロを目指す人のためのRuby入門 改訂2版」(通称・チェリー本。以下、本書)は執筆当時最新だったRuby 3.0を対象にしています。
本書は紙の本であるため、簡単に内容をアップデートすることができません。しかし、何もしないとどんどん内容が古くなってしまい、「本の通りやってみたけど、今使っているRubyとなんか動きが違う」ということになってしまいます。
そこで新しいRubyのバージョンがリリースされて、本書の説明と異なる部分が出てきたときは、毎回ネット上でその差異を説明するようにしています。その説明を読めば、動きが違う部分があってもきっと落ち着いて対処できるはず、という算段です。
というわけで、この記事ではRuby 4.0で発生する「プロを目指す人のためのRuby入門 改訂2版」との差異について説明します(第1版との差異ではないのでご注意ください)。
また、「プロを目指す人のためのRuby入門 改訂2版」を持っていない人でも役に立ちそうなRuby 4.0の新機能や変更点もあわせて紹介します!
なお、本文に出てくる章番号や項番号は、本書の中で使われている番号です。
参考: もう読みましたか?Ruby 3.1〜3.4との差異はこちら
Ruby 3.1〜3.4で発生する差異については以下の記事にまとめてあります。
- 公式リファレンスのURLが変わった(1.8)
- IRB上で自動補完とドキュメント表示ができるようになった(第2章 P49のコラム「Ruby 2.7以降で使えるirbの便利機能」)
- パターンマッチのピン演算子にローカル変数以外の式も渡せるようになった(11.3.2)
- パターンマッチのピン演算子にインスタンス変数、クラス変数、グローバル変数が渡せるようになった(11.3.2)
- 1行パターンマッチが実験的機能でなくなった(11.5.2)
- debug.gemがインストール不要になった(12.4.4)
- エラーハイライト(error_highlight)が導入された(本書全般、特に第12章)
- Steepの型チェックが少し厳しくなった(13.10.2)
- TypeErrorとArgumentError発生時の表示がわかりやすくなった(本書全般、12.3.3、12.3.4)
- endキーワードに過不足がある場合のエラー表示が改善された(9.6.7、12.3.8)
- Setクラスが組み込みクラスになった(4.7.4)
- パターンマッチのfindパターンが実験的機能ではなくなった(11.3.7)
- Minitestの型情報の追加方法が変わった(13.10.2)
- irbのプロンプト表示が少し変わった(1.6、本書全般)
- NoMethodErrorやNameError発生時のエラーメッセージが少し変わった(本書全般)
- 13.6節のサンプルコードが警告ではなくエラーになる
- エラーメッセージの表示形式が変わった(本書全般)
- irb上で表示されるハッシュの表示形式が変わった(5章、本書全般)
- irbでデータ型に基づいた入力補完ができるようになった(第2章のコラム「Ruby 2.7以降で使えるirbの便利機能」)
- 文字列の破壊的変更が警告扱いになった(2.11.3、本書全般)
- ブロックを使わないメソッドにブロックを渡すと警告が出るようになった(10.2.1)
- 2ヶ月おきに安定版がリリースされるようになった(第2章のコラム「Rubyのリリースサイクルについて」)
上記の記事と重複する内容はこの記事では説明しません。
ですので、まだ読まれていない方は先に上の記事を読んでから、この記事に戻ってくることをお勧めします。
それでは以下が本編です。
本文の説明と実行結果が異なるもの
以下で説明する内容は、Ruby 4.0で実行した場合に本書(つまりRuby 3.0)で説明している内容と実行結果が異なる部分です。
メジャーバージョンが上がった(本書全般)
これまではRuby 3.0から3.4まで、Ruby 3系としてバージョンが上がってきましたが、今回はRuby 3.5ではなくRuby 4.0になりました。
メジャーバージョンが上がったのは、「リリース30周年だから」「Ruby::BOXやZJITが(試験的に)導入されたから」など、いくつかの理由があるようです。
Ruby は 1995 年に最初のリリースが発表されたので、今年はリリース30周年という記念の年になります。 というわけで、それを記念しての Ruby 4.0.0 というリリースになりました。
Ruby::Box は導入提案時には Namespace と呼ばれていたもので、Matz が「Namespace か ZJIT が入れば次のリリースを Ruby 4.0.0 とする」と RubyKaigi などで宣言していたくらい、肝いりの機能です。
とはいえ、後方互換性を捨てるような大きな変更点はないので、これまで「プロを目指す人のためのRuby入門」で学んだ知識が無駄になるようなことはありません。
また、既存アプリケーションのRuby 3.4から4.0へのアップデートもスムーズに行えるはずです。
エラーメッセージの表示形式が変わった(本書全般)
Ruby 4.0ではエラーメッセージの表示形式が少し変わりました。
以下は引数指定エラー(ArgumentError)が発生したときのエラーメッセージです。
# 本書の記述 (7.4.2)
1) Error:
GateTest#test_gate:
ArgumentError: wrong number of arguments (given 1, expected 0)
test/gate_test.rb:6:in `initialize'
test/gate_test.rb:6:in `new'
test/gate_test.rb:6:in `test_gate'
1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
# Ruby 4.0
1) Error:
GateTest#test_gate:
ArgumentError: wrong number of arguments (given 1, expected 0)
test/gate_test.rb:6:in 'BasicObject#initialize'
test/gate_test.rb:6:in 'GateTest#test_gate'
1 runs, 0 assertions, 0 failures, 1 errors, 0 skips
Ruby 3.0とRuby4.0では以下の点が異なっています。
-
initializeやtest_gateではなく、BasicObject#initializeやGateTest#test_gateのように、メソッドが定義されているクラス名が表示されるようになった -
newは表示されなくなった
ちなみに、Ruby 3.4とRuby 4.0を比較すると、Ruby 3.4では以下のようにClass#newも表示されていた点が異なります。
# Ruby 3.4だと Class#new も表示されていた
test/gate_test.rb:6:in 'BasicObject#initialize'
test/gate_test.rb:6:in 'Class#new'
test/gate_test.rb:6:in 'GateTest#test_gate'
irb上で表示されるSetオブジェクトの表示形式が変わった(4.7.4)
Ruby 4.0ではirb上で表示されるハッシュの表示形式が変わりました。
たとえば以下は4.7.4項のサンプルコードをirbで実行した場合の表示です。
# Ruby 3.0
irb(main):001> a = Set[1, 2, 3]
=> #<Set: {1, 2, 3}>
# Ruby 4.0
irb(main):001> a = Set[1, 2, 3]
=> Set[1, 2, 3]
上のように、Ruby 4.0ではSetオブジェクトを作成するときの記法(Set[1, 2, 3])と同じ形式で表示されるようになりました。
Pathnameクラスが組み込みクラスになった(13.3)
Ruby 4.0ではPathnameクラスが組み込みクラスになりました。
そのため、以下のサンプルコードではrequire 'pathname'を書く必要がありません。
# Ruby 4.0ではPathnameクラスを使うのにrequireは不要
# require 'pathname'
# カレントディレクトリ配下にあるlibディレクトリを表すオブジェクトを作る
lib = Pathname.new('./lib')
# 以下略
typeprofコマンドの実行結果が少し異なる (13.10.1)
Ruby 4.0.1ではTypeProf 0.31.1がインストールされます。
$ typeprof --version
typeprof 0.31.1
以下のtypeprofコマンドを実行すると、sig/fizz_buzz.rbsの中身が書籍と異なります。
typeprof test/fizz_buzz_test.rb -o sig/fizz_buzz.rbs
書籍のsig/fizz_buzz.rbs
# TypeProf 0.12.0
# Classes
class Object
private
def fizz_buzz: (Integer n) -> String
end
class FizzBuzzTest
def test_fizz_buzz: -> untyped
end
TypeProf 0.31.1のsig/fizz_buzz.rbs
# TypeProf 0.31.1
# test/fizz_buzz_test.rb
class FizzBuzzTest # failed to identify its superclass
def test_fizz_buzz: -> untyped
end
ご覧のとおり、TypeProf 0.31.1では以下の行が出力されないので、手動で追加してください。
class Object
private
def fizz_buzz: (Integer n) -> String
end
また、13.10.2項でsteep checkを実行すると、"Ruby::UnknownConstant"というエラーが発生します(以下はSteep 1.10.0の実行結果)。
$ steep check
# Type checking files:
.F.
test/fizz_buzz_test.rb:4:21: [warning] Cannot find the declaration of constant: `Minitest`
│ Diagnostic ID: Ruby::UnknownConstant
│
└ class FizzBuzzTest < Minitest::Test
~~~~~~~~
Detected 1 problem from 1 file
このエラーの対処方法は以下の記事を参照してください。
その他、Ruby 4.0で注目したい新機能や変更点
ここから下では「プロを目指す人のためのRuby入門」を読んだ方なら知っておいて損のない、注目の新機能します。
論理演算子の前で改行できるようになった
Ruby 4.0では以下のように、&&, ||, and, orの前で改行できるようになりました。
# Ruby 3.4なら構文エラー(SyntaxError)
# Ruby 4.0なら動く
user = find_user('Alice')
|| find_user('Bob')
|| find_user('Carol')
なお、Ruby 3.4以前だと以下のように論理演算子の後で改行する必要がありました。
# これならRuby 3.4以前でも動く
user = find_user('Alice') ||
find_user('Bob') ||
find_user('Carol')
ArgumentError発生時の表示が親切になった
以下のようなRubyスクリプト(ArgumentErrorが発生するもの)をsample.rbに保存してrubyコマンドで実行してみましょう。
def greet(country)
if country == 'japan'
'こんにちは'
else
'hello'
end
end
# 引数が少ない
greet
すると、Ruby 3.4と4.0で表示される結果が異なります。
# Ruby 3.4
$ ruby sample.rb
sample.rb:1:in 'greet': wrong number of arguments (given 0, expected 1) (ArgumentError)
from sample.rb:10:in '<main>'
# Ruby 4.0
$ ruby sample.rb
sample.rb:1:in 'Object#greet': wrong number of arguments (given 0, expected 1) (ArgumentError)
caller: sample.rb:10
| greet
^^^^^
callee: sample.rb:1
| def greet(country)
^^^^^
from sample.rb:10:in '<main>'
Ruby 3.4ではシンプルにエラーメッセージとバックトレースが表示されるだけですが、Ruby 4.0ではそれに加え、メソッドを呼び出した側(caller)と呼び出された側(callee)のコードスニペットも表示されます。
また、エラーメッセージもよく見ると、'greet'が'Object#greet'のようにクラス名付きに変わっています。
-sample.rb:1:in 'greet': ...
+sample.rb:1:in 'Object#greet': ...
Rubyというモジュールが定義された
Ruby 4.0ではRubyという名前のモジュールがトップレベルに定義されました。
このRubyモジュールにはRubyに関連するクラスやモジュール、定数が定義されます。
# Ruby 4.0
Ruby.class #=> Module
なお、Ruby 3.4の時点で、Rubyという名前の定数を宣言していると警告が出るようになっていました。
# Ruby 3.4
Ruby = 1
#=> warning: ::Ruby is reserved for Ruby 3.5
クラスやメソッドの定義を隔離するRuby::BOXが導入された
Ruby 4.0ではクラスやメソッドの定義を隔離する、Ruby::BOXという機能が導入されました。
以下は上の記事で紹介されているRuby::BOXの利用例です。
Ruby::Box を使えば、異なるバージョンの gem を同時に使うことができます。
# 引用: https://product.st.inc/entry/2025/12/25/134453
# greeting-1.0.0.rb
class Greeting
VERSION = "1.0.0"
def say_hello = puts("Hello, user!")
end
# 引用: https://product.st.inc/entry/2025/12/25/134453
# greeting-2.0.0.rb
class Greeting
VERSION = "2.0.0"
def say_hello(name) = puts("Hello, #{name}!")
end
# 引用: https://product.st.inc/entry/2025/12/25/134453
# Ruby::Box b1 に 1.0.0 の greeting をロードする
b1 = Ruby::Box.new
b1.require "./greeting-1.0.0"
# Ruby::Box b2 に 2.0.0 の greeting をロードする
b2 = Ruby::Box.new
b2.require "./greeting-2.0.0"
# 各 Ruby::Box に、それぞれのライブラリがロードされている
p b1::Greeting::VERSION #=> "1.0.0"
p b2::Greeting::VERSION #=> "2.0.0"
# それぞれの say_hello が呼び分けられる
p b1::Greeting.new.say_hello #=> "Hello"
p b2::Greeting.new.say_hello("mame") #=> "Hello, mame!"
詳しくは上で紹介した「Ruby::Box ダイジェスト紹介」をご覧ください。
Ruby公式サイトがリニューアルされた
言語機能の変更ではありませんが、Rubyリリース30周年を記念して公式サイトのデザインがリニューアルされました。
詳細は以下の記事をご覧ください。
他にも魅力的な新機能や変更点がたくさん!!
この記事では「プロを目指す人のためのRuby入門」の読者のみなさんが興味を持ちそうな新機能を紹介しましたが、Ruby 4.0にはこのほかにもたくさんの新機能や変更点があります。
より詳しい内容については以下の情報源に記載されているのでこちらも要チェックです。
https://github.com/ruby/ruby/blob/v4.0.0/NEWS.md
そして、例年通り2025年のクリスマスにRuby 4.0を届けてくれたMatzさんやコミッタのみなさんに感謝したいと思います。どうもありがとうございました!
みなさんもぜひRuby 4.0の新機能を試してみてください😉
まとめ
というわけで、この記事ではRuby 4.0で発生する「プロを目指す人のためのRuby入門 改訂2版」との差異をまとめました。
冒頭にも書いたとおり、メジャーバージョンは上がっていますが、後方互換性は十分維持されているので、「プロを目指す人のためのRuby入門 改訂2版」の内容はRuby 4.0でも十分通用します。
「プロを目指す人のためのRuby入門 改訂2版」とこの記事(と、これまでに書いてきたRuby 3.1〜3.4の差異)をあわせて読めば、Ruby 4.0でもバリバリと実践的なコードが書けるはずです。
まだ「プロを目指す人のためのRuby入門 改訂2版」を購入されていない方は、この機会にぜひ購入を検討してもらえると嬉しいです。
みなさん、よろしくお願いします!
PR:「プロを目指す人のためのRuby入門 改訂2版」について
「プロを目指す人のためのRuby入門 改訂2版」は、他の言語での開発経験があり、これからRubyを始めたい人や、Rubyプログラミングの経験はある程度あるものの、まだまだ自信がない人に向けて、Rubyの言語仕様や開発の現場で役立つ知識を詳しく、ていねいに解説したRubyの入門書です。
改訂2版ではRuby 3.0に完全対応し、「パターンマッチ」の章を新たに追加するなど、第1版に比べてさらに内容が充実しています。
改訂2版の変更点については以下のブログ記事で詳しく説明していますので、こちらのぜひチェックしてみてください。
