【一人 bugs.ruby Advent Calendar 2021】[Feature #18035] Introduce general model/semantic for immutable by default.【8日目】
一人 bugs.ruby Advent Calendar 2021 8日目の記事になります。
今回は freeze されている事を明示化する Immutable モジュールの提案です。
[Feature #18035] Introduce general model/semantic for immutable by default.
Immutable モジュールで freeze されていることを明示化する提案です。
以下のように Immutable モジュールを mixin すると明示的に freeze されるようになります。
module Immutable def new(...) super.freeze end end class MyImmutableObject extend Immutable def initialize(x) @x = x end def freeze return self if frozen? @x.freeze super end end o = MyImmutableObject.new([1, 2, 3]) puts o.frozen? # => true
提案された内容では dup や clone した場合も freeze になる。
どう freeze するのかは freeze メソッドを再定義してクラスごとに定義するようにするみたいです。
めっちゃ議論が進んでいてここではまとめきれてないんですが #freeze と #deep_freeze の違いや #deep_freeze すると singleton_class まで不変になってしまい困るのでは?みたいな話や 不変 にしたときの利点はなにか、みたいな話を議論してるぽいですねえ。
freeze とは別に Ractor での共有可能オブジェクトという概念もありいろいろと考慮点が多そうで大変そう。
以下、議論箇所のピックアップ。
- https://bugs.ruby-lang.org/issues/18035#note-6
- https://bugs.ruby-lang.org/issues/18035#note-12
- https://bugs.ruby-lang.org/issues/18035#note-17
- https://bugs.ruby-lang.org/issues/18035#note-25
- https://bugs.ruby-lang.org/issues/18035#note-27
興味がある人はぜひチケットを読んでみよう!