From: ko1@... Date: 2020-09-03T19:20:56+00:00 Subject: [ruby-core:99889] [Ruby master Feature#17145] Ractor-aware `Object#deep_freeze` Issue #17145 has been updated by ko1 (Koichi Sasada). One concern about the name "freeze" is, what happens on shareable objects on Ractors. For example, Ractor objects are shareable and they don't need to freeze to send beyond Ractor boundary. I also want to introduce Mutable but shareable objects using STM (or something similar) writing protocol (shareable Hash). What happens on `deep_freeze`? ---------------------------------------- Feature #17145: Ractor-aware `Object#deep_freeze` https://bugs.ruby-lang.org/issues/17145#change-87421 * Author: marcandre (Marc-Andre Lafortune) * Status: Open * Priority: Normal ---------------------------------------- I'd like to propose `Object#deep_freeze`: Freezes recursively the contents of the receiver (by calling `deep_freeze`) and then the receiver itself (by calling `freeze`). Values that are shareable via `Ractor` (e.g. classes) are never frozen this way. ```ruby # freezes recursively: ast = [:hash, [:pair, [:str, 'hello'], [:sym, :world]]].deep_freeze ast.dig(1, 1) # => [:str, 'hello'] ast.dig(1, 1).compact! # => FrozenError # does not freeze classes: [[String]].deep_freeze String.frozen? # => false # calls `freeze`: class Foo def freeze build_cache! puts "Ready for freeze" super end # ... end [[[Foo.new]]].deep_freeze # => Outputs "Ready for freeze" ``` I think a variant `deep_freeze!` that raises an exception if the result isn't Ractor-shareable would be useful too: ```ruby class Fire def freeze # do not call super end end x = [Fire.new] x.deep_freeze! # => "Could not be deeply-frozen: #" ``` -- https://bugs.ruby-lang.org/ Unsubscribe: