要約
クラスやモジュールをプロセス内で分離し、アプリケーションのコードやライブラリ、モンキーパッチを互いに隔離するための機能です。 Ruby 4.0 で導入されました。
Ruby::Box は Module のサブクラスで、その各インスタンスは 1 つの隔離された名前空間(ボックス)を表します。あるボックスの中で新しく定義したり変更したりしたクラス・モジュール・定数・グローバル変数は、そのボックスの外や他のボックスからは見えません。
Ruby::Box は実験的な機能です。既定では無効で、このとき Ruby::Box.enabled? は
false を返し、Ruby::Box.new は RuntimeError を発生させます。利用するには、ruby プロセスの起動時に環境変数 RUBY_BOX に 1 を設定します。
1 以外の値や未設定は無効を意味します。また、プロセスの起動後に設定しても有効にはなりません。
$ RUBY_BOX=1 ruby script.rb
有効な状態で起動すると次の警告が出力されます。
-W:no-experimental オプションで抑止できます。将来のバージョンで挙動が変更される可能性があります。
ruby: warning: Ruby::Box is experimental, and the behavior may change in the future!
ボックスは Ruby::Box.new で作成し、Ruby::Box#require(あるいは Ruby::Box#require_relative や Ruby::Box#load)でファイルをそのボックスに読み込みます。読み込んだファイルで定義されたクラス・モジュール・定数は、ボックスオブジェクト経由で参照できます。
# foo.rb
X = 1
class Something
def x = X
end
# main.rb
box = Ruby::Box.new
box.require_relative("foo")
X = 2
p X # => 2
p box::X # => 1
p box::Something.new.x # => 1
ボックスの中では組み込みクラスを開いて再定義できますが、その変更はボックスの外や他のボックスには影響しません。グローバル変数やトップレベルの定数・メソッドの変更も同様にボックスごとに隔離されます。
目次
継承しているメソッド
- Moduleから継承している特異メソッド
- Moduleから継承しているメソッド
-
- <
- <=
- <=>
- ===
- >
- >=
- alias_method
- ancestors
- attr
- attr_accessor
- attr_reader
- attr_writer
- autoload
- autoload?
- class_eval
- class_exec
- class_variable_defined?
- class_variable_get
- class_variable_set
- class_variables
- const_defined?
- const_get
- const_missing
- const_set
- const_source_location
- constants
- define_method
- deprecate_constant
- freeze
- include
- include?
- included_modules
- instance_method
- instance_methods
- method_defined?
- module_eval
- module_exec
- name
- prepend
- private_class_method
- private_constant
- private_instance_methods
- private_method_defined?
- protected_instance_methods
- protected_method_defined?
- public_class_method
- public_constant
- public_instance_method
- public_instance_methods
- public_method_defined?
- refinements
- remove_class_variable
- remove_method
- set_temporary_name
- singleton_class?
- to_s
- undef_method
- undefined_instance_methods
特異メソッド
current -> Ruby::Box | nilRuby 4.0 から[permalink][rdoc][edit]-
現在実行中のコードが属しているボックスを返します。
Ruby::Boxが無効なときはnilを返します。 enabled? -> boolRuby 4.0 から[permalink][rdoc][edit]-
Ruby::Boxが有効ならtrueを、無効ならfalseを返します。環境変数
RUBY_BOXに1を設定して ruby を起動したときにtrueになります。 new -> Ruby::BoxRuby 4.0 から[permalink][rdoc][edit]-
他のボックスから独立した新しいボックスを返します。
Ruby::Boxが無効なとき(環境変数RUBY_BOXに1を設定せずに起動したとき)は RuntimeError が発生します。
インスタンスメソッド
eval(code) -> objectRuby 4.0 から[permalink][rdoc][edit]-
文字列
codeを Ruby のコードとして self(レシーバのボックス)の中で評価し、その結果を返します。ファイルを Ruby::Box#load で読み込むのと同様に、
codeは self の中で実行されます。 inspect -> StringRuby 4.0 から[permalink][rdoc][edit]-
self を表す文字列を返します。
load(path, wrap = false) -> trueRuby 4.0 から[permalink][rdoc][edit]-
pathのファイルを self(レシーバのボックス)の中に読み込みます。Kernel?.load と同様ですが、ファイルは self の中で実行されます。
load_path -> [String]Ruby 4.0 から[permalink][rdoc][edit]-
self(レシーバのボックス)のライブラリ読み込みパスを表す配列を返します。
$LOAD_PATH のボックスごとの版に相当します。
require(feature) -> boolRuby 4.0 から[permalink][rdoc][edit]-
featureを self(レシーバのボックス)の中に読み込みます。Kernel?.require と同様ですが、読み込まれたファイルは self の中で実行されます。まだ読み込まれていなければ
trueを、すでに読み込み済みならfalseを返します。 require_relative(relative_feature) -> boolRuby 4.0 から[permalink][rdoc][edit]-
relative_featureを self(レシーバのボックス)の中に読み込みます。Kernel?.require_relative と同様ですが、読み込まれたファイルは self の中で実行されます。