Ruby 4.0.0 preview3 リリース

Ruby 4.0.0-preview3 が公開されました。

言語仕様の変更

  • *nilnil.to_a を呼び出さなくなりました。これは **nilnil.to_hash を呼び出さないのと同様です。 [Feature #21047]

  • 行頭の論理二項演算子 (||, &&, and, or) は、fluent dot(行頭のドット)のように前の行からの継続として扱われるようになりました。 以下の2つのコードは等価です:

      if condition1
         && condition2
        ...
      end
    
      if condition1 && condition2
        ...
      end
    

    [Feature #20925]

組み込みクラスの更新

注: 重要なクラスの更新のみを記載しています。

  • Kernel

    • Kernel#inspect#instance_variables_to_inspect メソッドの存在を確認するようになり、#inspect の文字列に表示するインスタンス変数を制御できるようになりました:

        class DatabaseConfig
          def initialize(host, user, password)
            @host = host
            @user = user
            @password = password
          end
      
          private def instance_variables_to_inspect = [:@host, :@user]
        end
      
        conf = DatabaseConfig.new("localhost", "root", "hunter2")
        conf.inspect #=> #<DatabaseConfig:0x0000000104def350 @host="localhost", @user="root">
      

      [Feature #21219]

    • 先頭に | を付けた Kernel#open によるプロセス生成という非推奨の挙動が削除されました。 [Feature #19630]

  • Binding

    • Binding#local_variables にナンバードパラメーターが含まれなくなりました。また、Binding#local_variable_getBinding#local_variable_set はナンバードパラメーターの操作を拒否するようになりました。 [Bug #21049]
  • File

    • カーネルとファイルシステムがサポートしている場合、Linux 上で statx システムコールを通じて File::Stat#birthtime が利用可能になりました。 [Feature #21205]
  • IO

    • IO.select がタイムアウト引数として Float::INFINITY を受け付けるようになりました。[Feature #20610]
    • 先頭に | を付けた IO クラスメソッドによるプロセス生成という非推奨の挙動が削除されました。 [Feature #19630]
  • Math

    • Math.log1pMath.expm1 が追加されました。 [Feature #21527]
  • Method

    • Method#source_locationProc#source_locationUnboundMethod#source_location は、[path, start_line, start_column, end_line, end_column] の5つの要素を持つ拡張された位置情報を返すようになりました。従来の [path, line] という2要素の形式は、結果に対して .take(2) を呼び出すことで取得できます。 [Feature #6012]
  • Proc

    • Proc#parameters は、匿名のオプション引数が必須の場合との整合性をとるため、[:opt, nil] ではなく [:opt] として表示するようになりました。 [Bug #20974]
  • Ractor

    • Ractor 間で通信するための新しい同期メカニズムとして Ractor::Port クラスが追加されました。 [Feature #21262]

        port1 = Ractor::Port.new
        port2 = Ractor::Port.new
        Ractor.new port1, port2 do |port1, port2|
          port1 << 1
          port2 << 11
          port1 << 2
          port2 << 12
        end
        2.times{ p port1.receive } #=> 1, 2
        2.times{ p port2.receive } #=> 11, 12
      

      Ractor::Port は以下のメソッドを提供します:

      • Ractor::Port#receive
      • Ractor::Port#send (または Ractor::Port#<<)
      • Ractor::Port#close
      • Ractor::Port#closed?

      結果として、Ractor.yieldRactor#take は削除されました。

    • Ractor の終了を待機するために Ractor#joinRactor#value が追加されました。これらは Thread#joinThread#value と同様です。
    • Ractor#join を実装するために内部で使用される低レベルインターフェースとして Ractor#monitorRactor#unmonitor が追加されました。
    • Ractor.select は Ractor と Port のみを受け付けるようになりました。Ractor が渡された場合、その Ractor が終了した時点で戻ります。
    • Ractor#default_port が追加されました。各 Ractor はデフォルトのポートを持っており、Ractor.sendRactor.receive で使用されます。
    • Ractor#close_incomingRactor#close_outgoing は削除されました。
    • 共有可能な Proc や lambda を作成するために Ractor.shareable_procRactor.shareable_lambda が導入されました。 [Feature #21550], [Feature #21557]
  • Range

    • Range#to_setEnumerator#to_set は、無限範囲 (endless ranges) による問題を防ぐためにサイズチェックを行うようになりました。 [Bug #21654]
    • Range#overlap? が無限範囲 (unbounded ranges) を正しく扱えるようになりました。[Bug #21185]
    • 始端のない (beginless) 整数範囲に対する Range#max の挙動が修正されました。 [Bug #21174] [Bug #21175]
  • Ruby

    • Ruby 関連の定数を含むトップレベルモジュール Ruby が定義されました。このモジュールは Ruby 3.4 で予約されていましたが、今回正式に定義されました。 [Feature #20884]
  • Ruby::Box

  • Set

    • Set は autoload される標準ライブラリのクラスではなく、組み込みクラス (core class) になりました。 [Feature #21216]
    • Set#inspect は、Set[] 構文 (例: #<Set: {1, 2, 3}> ではなく Set[1, 2, 3]) を使用した、eval に適した文字列を返すようになりました。これにより、Array や Hash のような他の組み込みコレクションクラスと一貫性が保たれます。 [Feature #21389]
    • Set#to_set および Enumerable#to_set に引数を渡すことは非推奨となりました。 [Feature #21390]
  • Socket

    • Socket.tcpTCPSocket.new は、初期接続のタイムアウトを指定するための open_timeout キーワード引数を受け付けるようになりました。 [Feature #21347]
  • String

    • Unicode バージョン 17.0.0 および Emoji バージョン 17.0 に更新されました。 [Feature #19908][Feature #20724][Feature #21275] (Regexp にも適用されます)
    • String#strip, strip!, lstrip, lstrip!, rstrip, rstrip! が拡張され、*selectors 引数を受け付けるようになりました。 [[Feature #21552]]
  • Thread

    • Kernel#raise と同様の Thread#raise(cause:) 引数のサポートが導入されました。 [Feature #21360]
  • Fiber

    • Kernel#raise と同様の Fiber#raise(cause:) 引数のサポートが導入されました。 [Feature #21360]
  • Fiber::Scheduler

    • 指定された例外で Fiber に割り込みをかけるための Fiber::Scheduler#fiber_interrupt が導入されました。当初のユースケースは、ブロックしている IO 操作が閉じられた際に、その IO 操作待ちをしている Fiber に割り込むことです。 [Feature #21166]
  • Pathname

    • Pathname は default gem から Ruby の組み込みクラスに昇格しました。 [Feature #17473]

標準ライブラリの更新

以下の bundled gems は default gems から昇格しました。

  • ostruct 0.6.3
  • pstore 0.2.0
  • benchmark 0.5.0
  • logger 1.7.0
  • rdoc 6.17.0
  • win32ole 1.9.2
  • irb 1.15.3
  • reline 0.6.3
  • readline 0.0.4
  • fiddle 1.1.8

注目すべき機能変更があった標準ライブラリの変更のみを記載しています。

その他の変更は以下のセクションに記載されています。また、GitHub Releases があるものについては、以前のバンドルバージョン(Ruby 3.3.0)からのリリース履歴もリストアップしています。

以下の default gem が追加されました。

  • win32-registry 0.1.2

以下の default gems が更新されました。

  • RubyGems 4.0.1
  • bundler 4.0.1
  • date 3.5.1
  • digest 3.2.1
  • english 0.8.1
  • erb 6.0.0
  • etc 1.4.6
  • fcntl 1.3.0
  • fileutils 1.8.0
  • forwardable 1.4.0
  • io-console 0.8.1
  • io-nonblock 0.3.2
  • io-wait 0.4.0.dev
  • ipaddr 1.2.8
  • json 2.17.1
  • net-http 0.8.0
  • openssl 4.0.0.pre
  • optparse 0.8.1
  • pp 0.6.3
  • prism 1.6.0
  • psych 5.3.0
  • resolv 0.7.0
  • stringio 3.1.9.dev
  • strscan 3.1.6.dev
  • timeout 0.5.0
  • uri 1.1.1
  • weakref 0.1.4
  • zlib 3.2.2

以下の bundled gems が更新されました。

  • minitest 5.26.2
  • power_assert 3.0.1
  • rake 13.3.1
  • test-unit 3.7.3
  • rexml 3.4.4
  • net-ftp 0.3.9
  • net-imap 0.5.12
  • net-smtp 0.5.1
  • matrix 0.4.3
  • prime 0.1.4
  • rbs 3.9.5
  • typeprof 0.31.0
  • debug 1.11.0
  • base64 0.3.0
  • bigdecimal 3.3.1
  • drb 2.2.3
  • syslog 0.3.0
  • csv 3.3.5
  • repl_type_completor 0.1.12

サポートされているプラットフォーム

  • Windows

    • MSVC のバージョン 14.0 (_MSC_VER 1900) より前のサポートを終了しました。 これは、Visual Studio 2015 以降が必要になったことを意味します。

互換性の問題

  • Ractor::Port の追加に伴い、以下のメソッドが Ractor から削除されました:

    • Ractor.yield
    • Ractor#take
    • Ractor#close_incoming
    • Ractor#close_outgoging

    [Feature #21262]

  • ObjectSpace._id2ref は非推奨になりました。 [Feature #15408]

  • Process::Status#& および Process::Status#>> は削除されました。 これらは Ruby 3.3 で非推奨になっていました。 [Bug #19868]

  • rb_path_check は削除されました。この関数は Ruby 2.7 で削除された $SAFE パスのチェックに使用されており、既に非推奨となっていました。 [Feature #20971]

標準ライブラリの互換性の問題

  • CGI ライブラリは default gems から削除されました。現在は以下のメソッドのために cgi/escape のみを提供しています:

    • CGI.escapeCGI.unescape
    • CGI.escapeHTMLCGI.unescapeHTML
    • CGI.escapeURIComponentCGI.unescapeURIComponent
    • CGI.escapeElementCGI.unescapeElement

    [Feature #21258]

  • Set が標準ライブラリから組み込みクラスへ移行したことに伴い、set/sorted_set.rb は削除され、SortedSet は autoload される定数ではなくなりました。SortedSet を使用するには sorted_set gem をインストールし、require 'sorted_set' を行ってください。 [Feature #21287]

C API の更新

  • IO

    • rb_thread_fd_close は非推奨となり、何もしなくなりました (no-op)。C 拡張から Ruby コードにファイルディスクリプタを公開する必要がある場合は、RUBY_IO_MODE_EXTERNAL を使用して IO インスタンスを作成し、それを閉じるために rb_io_close(io) を使用してください(これは IO インスタンス上のすべての保留中の操作を中断し、待機します)。ファイルディスクリプタを直接閉じると、保留中の操作は中断されず、未定義の動作につながる可能性があります。言い換えれば、2つの IO オブジェクトが同じファイルディスクリプタを共有している場合、一方を閉じても他方には影響しません。 [Feature #18455]
  • GVL

    • rb_thread_call_with_gvl は GVL の有無にかかわらず動作するようになりました。 これにより、Gem は ruby_thread_has_gvl_p のチェックを回避できます。 ただし、GVL には引き続き注意を払ってください。 [Feature #20750]
  • Set

    • Set のための C API が追加されました。以下の関数がサポートされています: [Feature #21459]

      • rb_set_foreach
      • rb_set_new
      • rb_set_new_capa
      • rb_set_lookup
      • rb_set_add
      • rb_set_clear
      • rb_set_delete
      • rb_set_size

実装の改善

Ractor

Ractor をより安定的かつ高性能で使いやすくするために、多くの作業が行われました。これらの改善により、Ractor の実装は実験的ステータスの脱却に近づいています。

  • パフォーマンスの改善
    • Frozen string とシンボルテーブルは内部的にロックフリーなハッシュセットを使用するようになりました
    • メソッドキャッシュのルックアップは、ほとんどの場合ロックを回避します
    • クラス(および geniv)インスタンス変数へのアクセスが高速化され、ロックを回避します
    • オブジェクト割り当て時のキャッシュ競合が回避されるようになりました
    • object_id はほとんどの場合ロックを回避します
  • バグ修正と安定性
    • Ractor と Thread を組み合わせた際のデッドロックの可能性を修正しました
    • Ractor 内での require と autoload に関する問題を修正しました
    • Ractor 間でのエンコーディング/トランスコーディングの問題を修正しました
    • GC 操作とメソッド無効化における競合状態を修正しました
    • Ractor 開始後のプロセス fork に関する問題を修正しました

JIT

  • ZJIT
    • 実験的なメソッドベースの JIT コンパイラ を導入しました。 --zjit サポートを有効にするには、Rust 1.85.0 以降で Ruby をビルドしてください。
    • Ruby 4.0.0 時点では、ZJIT はインタプリタより高速ですが、YJIT ほど高速ではありません。 ZJIT を試すことを推奨しますが、現時点では本番環境への導入は避けることをお勧めします。
    • 私たちの目標は、Ruby 4.1 で ZJIT を YJIT よりも高速にし、本番環境で利用可能にすることです。
  • YJIT
    • RubyVM::YJIT.runtime_stats
      • ratio_in_yjit はデフォルトビルドでは機能しなくなりました。 configure--enable-yjit=stats を指定して --yjit-stats を有効にしてください。
      • デフォルトの統計に invalidate_everything を追加しました。これは TracePoint によってすべてのコードが無効化されたときにインクリメントされます。
    • RubyVM::YJIT.enablemem_size:call_threshold: オプションを追加しました。
  • RJIT
    • --rjit は削除されました。サードパーティ JIT API の実装は ruby/rjit リポジトリに移動します。

その他の変更点

より詳細な情報は NEWScommit logs を参照してください。

これらの変更により、Ruby 3.4.0から 3776 ファイルが変更され、 222800 行が追加され、 293617 行が削除されました!deletions(-)

Download

  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.gz

    SIZE: 23865890
    SHA1: a348f196e0314d8863ae5d5f0a588a37c52aa89c
    SHA256: 43d0926e776fbd5599adcc7bccb4ccc804e109f402a2068607a2a86562c2cdc0
    SHA512: 1c7f10405832646eceacb278ea7cc3445dc0e1778e9a9331062f2fb0164d45ba5af0b4244dc6ae46e36730d6cafb4c4196fbd4f4fb74029afde5ecf4fd433a6b
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.tar.xz

    SIZE: 17915004
    SHA1: b7b99831558b9cd6cf8fb148f07cd4e8e59d9e99
    SHA256: 8d7a503b2c4abcfacf0fa54ac56d37f7dd6d643a3a717661729cabbe947610a6
    SHA512: b046c015a58daafb1640d8db62a36ebf64c7f83fbfb033fa327458afab6e9c31b1c2b194b347fd63f16e413e732d3e6ac20076282b433ef16923343c9ed84aa1
    
  • https://cache.ruby-lang.org/pub/ruby/4.0/ruby-4.0.0-preview3.zip

    SIZE: 29403010
    SHA1: 689cb6c497afb96d26745708e772b63afca52e1a
    SHA256: c29147727a8eacf01b942012e3d6fa26010f98f43f6ab249c391f47c744f44cf
    SHA512: c07d6069b391e38ec99725201d021998ccfb913423636f729eccd0cff17cb9ab7e8565f46d68eea96cf7f546cee647892ca3f37b720a202e8e5496cd10dd168b
    

What is Ruby

Rubyはまつもとゆきひろ (Matz) によって1993年に開発が始められ、今もオープンソースソフトウェアとして開発が続けられています。Rubyは様々なプラットフォームで動き、世界中で、特にWebアプリケーション開発のために使われています。