【一人 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
興味がある人はぜひチケットを読んでみよう!