【一人 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

提案された内容では dupclone した場合も freeze になる。
どう freeze するのかは freeze メソッドを再定義してクラスごとに定義するようにするみたいです。
めっちゃ議論が進んでいてここではまとめきれてないんですが #freeze#deep_freeze の違いや #deep_freeze すると singleton_class まで不変になってしまい困るのでは?みたいな話や 不変 にしたときの利点はなにか、みたいな話を議論してるぽいですねえ。
freeze とは別に Ractor での共有可能オブジェクトという概念もありいろいろと考慮点が多そうで大変そう

以下、議論箇所のピックアップ。

興味がある人はぜひチケットを読んでみよう!