DiffDaily

Deep & Concise - OSS変更の定点観測

[Rails] YJIT有効化処理から不要な`defined?`チェックを削除

rails/rails

Context

Rails 8.0からRuby 3.3.0が最低要件となったことで、RubyVM::YJIT.enableメソッドは常に利用可能になりました。これまでRailsのイニシャライザでは、YJITを有効化する際にdefined?を使ってメソッドの存在確認を行っていましたが、この保護機構が不要になったため削除されました。

Ruby 3.3.0ではRubyVM::YJIT.enableが標準機能として追加され、実行時にYJITを有効化できるようになっています。Rails側のコードもこの変更に合わせて簡素化されました。

Technical Detail

変更内容

変更前:

initializer :enable_yjit do
  if config.yjit && defined?(RubyVM::YJIT.enable)
    options = config.yjit.is_a?(Hash) ? config.yjit : {}
    RubyVM::YJIT.enable(**options)
  end
end

変更後:

initializer :enable_yjit do
  if config.yjit
    options = config.yjit.is_a?(Hash) ? config.yjit : {}
    RubyVM::YJIT.enable(**options)
  end
end

Ruby 3.3.0での確認

Ruby 3.3.0以降では、RubyVM::YJIT.enableは常に定義されています:

$ ruby -ve 'p defined?(RubyVM::YJIT.enable)'
ruby 3.3.0 (2023-12-25 revision 5124f9ac75) [x86_64-linux]
"method"

YJITの設定方法

この変更後も、YJITの有効化方法に変更はありません。設定ファイルで以下のように指定できます:

# config/application.rb
config.yjit = true  # デフォルトオプションで有効化

# または
config.yjit = { stats: true }  # オプション付きで有効化

Impact

この変更は内部的なコード整理であり、Rails利用者の設定方法や挙動には影響しません。Ruby 3.3.0未満のバージョンではRailsが動作しなくなるため、defined?チェックが不要になりました。

コードの可読性が向上し、Rails 8.0がRuby 3.3.0以降を要求することが明確になります。