Ruby 3.1.0のリリース
2021年12月25日、Ruby 3.1.0がリリースされました。2013年以降毎年12月25日のクリスマスにメジャーバージョンアップのリリースが定番化されています。今回も無事にリリースとなり、Ruby 3.1.0の新機能と変更点をお届けしていきます。 【参考】:Ruby 3.1.0 リリース
そもそもRubyとは
Rubyとは、まつもとゆきひろ氏によって開発されたオブジェクト指向プログラム言語で、コンパイラとインタプリタがあります。正規表現をRegexpクラスとして定義し活用することで、複雑に発生する文字列のパターンマッチングを効率的に行うことができます。オブジェクト指向言語として全てのデータ型がオブジェクトとして扱われます。 【参考】:Rubyとは
Ruby 3.1.0の機能追加
早速ですが、Ruby 3.1.0の機能追加について概要をまとめておきます。
・YJIT CRuby用プロセス内JITコンパイラ 公式サイトによるとrailsbenchでは最大22%、liquied-renderでは39%の高速化を達成していることから、パフォーマンスの高さが伺えます。実験的機能なため、デフォルトでは無効化されていますが、”--yjit”コマンドラインオプションを指定することで利用可能です。
・debug.gem lib/debug.rbの置換で、完全に書き直されたデバッガです。debug.gemはデバッグ時の速度低下を抑制しており、リモートデバッグをサポートします。VSCodeとChromeブラウザと連携し、デバッグすることができます。マルチプロセス・マルチスレッドプログラムのデバッグに対応しており、利便性を高める改善が施されています。
・error_highlight 組み込みgemであるerror_highlightにより、NameError発生時に該当位置が表示されます。デフォルトで有効となっており、コマンドラインオプションで”--disable-error_highlight”を指定することで無効化可能です。
・IRBのオートコンプリートとドキュメント表示 IRBでTabとShift+Tabを使うと、オートコンプリート機能となる補完候補ダイアログが表示されます。
・MJITのパフォーマンス改善 --jit-max-cacheのデフォルト値が100から10,000に変更され、従来1,000インストラクションでスキップされたJITコンパイラの処理が正しく扱われます。クラスイベント用TracePointが有効の時にJITコードが正しく処理されます。
・標準ライブラリのアップデート default gemsのアップデートがされ、以下のバージョンが更新されました。 RubyGems 3.3.3、base64 0.1.1、benchmark 0.2.0、bigdecimal 3.1.1、bundler 2.3.3 cgi 0.3.1、csv 3.2.2、date 3.2.2、did_you_mean 1.6.1、digest 3.1.0、drb 2.1.0 erb 2.2.3、error_highlight 0.3.0、etc 1.3.0、fcntl 1.0.1、fiddle 1.1.0、fileutils 1.6.0 find 0.1.1、io-console 0.5.10、io-wait 0.2.1、ipaddr 1.2.3、irb 1.4.1、json 2.6.1 logger 1.5.0、net-http 0.2.0、net-protocol 0.1.2、nkf 0.1.1、open-uri 0.2.0 openssl 3.0.0、optparse 0.2.0、ostruct 0.5.2、pathname 0.2.0、pp 0.3.0 prettyprint 0.1.1、psych 4.0.3、racc 1.6.0、rdoc 6.4.0、readline 0.0.3、readline-ext 0.1.4 reline 0.3.0、resolv 0.2.1、rinda 0.1.1、ruby2_keywords 0.0.5、securerandom 0.1.1 set 1.0.2、stringio 3.0.1、strscan 3.0.1、tempfile 0.1.2、time 0.2.0、timeout 0.2.0 tmpdir 0.1.2、un 0.2.0、uri 0.11.0、yaml 0.2.0、zlib 2.1.1
bundled gemsのアップデートでは、以下のバージョンが更新されました。 minitest 5.15.0、power_assert 2.0.1、rake 13.0.6、test-unit 3.5.3、rexml 3.2.5 rbs 2.0.0、typeprof 0.21.1
さらに、以下のライブラリがbundled gemsとなっています。 net-ftp 0.1.3、net-imap 0.2.2、net-pop 0.1.1、net-smtp 0.3.1、matrix 0.4.2 prime 0.1.2、debug 1.4.0
その他の詳細は以下のリンクをご参照ください。 【参考】:NEWS for Ruby 3.1.0
言語系の変更点
以下が主要な3.0.0からの言語変更点です。サンプルコードは「NEWS for Ruby 3.1.0」の公開コードです。
・[Feature #11256]
ブロックの引数が他のメソッドに引き渡しをする際、省略可能です。
def foo(&)
bar(&)
end
【参考】:Feature #11256
・[Feature #17411]
パターンマッチの表現にピン演算子がサポートされます。
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
#=> [[3, 5], [5, 7], [11, 13]]
【参考】:Feature #17411
・[Feature #17724]
ピン演算子でインスタンス・クラス・グローバル変数がサポートされます。
@n = 5
Prime.each_cons(2).lazy.find{_1 in [n, ^@n]}
#=> [3, 5]
【参考】:Feature #17724
・[Feature #16182]
1行パターンマッチングの呼び出しカッコが省略可能です。
[0, 1] => _, x
{y: 2} => y:
x #=> 1
y #=> 2
【参考】:Feature #16182
・[Bug #4443]
マルチアサインメントの評価方法が、シングルアサインメントの評価方法と一貫性を確保し、左から右へ評価します。
foo[0], bar.baz = a, b
3.1.0以前はa・b・foo・[]・bar・baz= の順に評価されていました。
3.1.0以降はfoo・bar・a・b・[]・baz= の順に評価されます。
【参考】:Bug #4443
・[Feature #14579] Hashリテラル値とキーワード引数が省略可能です。 【参考】:Feature #14579
・[Feature #17592] メインリアクタが共有可能なクラスインスタンス変数の読み込みが可能です。 【参考】:Feature #17592
・[Feature #17398]
エンドレスメソッド定義が許可されます。
def foo = puts "Hello"
【参考】:Feature #17398
上記の他、コアクラスにも[Feature]と[Bug]の更新がされているため、必要に応じてご確認ください。 【参考】:NEWS for Ruby 3.1.0 Core classes updates
Array・Class・Enumerable・Enumerator::Lazy・File・GC・Integer・Kernel・Marshal・MatchData・Method / UnboundMethod・Module・Process・Struct・String・Thread・Thread::Backtrace・Thread::Queue・Time・TracePoint・$LOAD_PATH・Fiber Scheduler・Refinement、と多岐に渡り更新されています。
PerlやPythonに満足できない方はRubyに挑戦しましょう
Rubyは開発者であるまつもとゆきひろ氏が「Perlよりも強力で、Python2よりもオブジェクト指向な言語が欲しかったんだ」と語っている通り、多くの言語の特長を融合し洗練させたものです。もうじきRuby 2.6がサポート終了となりますが、その受け皿としてもRuby 3.1.0は品質も機能も十分なリリースと言えます。
編集部オススメコンテンツ
アンドエンジニアへの取材依頼、情報提供などはこちらから