From: mame@... Date: 2020-12-20T03:00:33+00:00 Subject: [ruby-core:101550] [Ruby master Misc#17412] Regexp vs Range: freezing differences Issue #17412 has been updated by mame (Yusuke Endoh). Status changed from Open to Closed Hi, zverok (Victor Shepelev) wrote: > > For the record: `Regexp.new` should continue to return unfrozen Regexp instance. (@mame at #16377#note-7) This is not my opinion but Matz's decision. I'm sorry if I was not clear. > > I'm for freezing all Ranges, not only Range literals. I hate the idea of freezing only literals because casually mixing frozen and unfrozen objects leads to hard-to-debug bugs that depend upon data flow. (mame (Yusuke Endoh) at #15504#note-3) This is just my opinion. --- The difference of the two decisions is whether we find a real-world example affected by the changes. @ko1 found a real-world code that defines a singleton method on a Regexp instance in the Ruby's test framework: https://github.com/ruby/ruby/blob/648bbfcc65ad28841db2206513375dd88f064c52/tool/lib/test/unit.rb#L130 And matz decided that only Regexp literals are frozen. In practical, freezing Regexps is needed for Ractors, and freezing only Regexp literals is considered useful enough for Ractors. (I personally don't like it very much, but I'm not against the decision.) In regards to Ranges, we don't know any real-world case affected by the change yet. Matz said "Since there's possiblity of breakage, I'd like to experiment it." He may revert the change if someone reports any case broken by this change (before the official releases). But so far, no breakage is reported. ---------------------------------------- Misc #17412: Regexp vs Range: freezing differences https://bugs.ruby-lang.org/issues/17412#change-89333 * Author: zverok (Victor Shepelev) * Status: Closed * Priority: Normal ---------------------------------------- While working on the changelog, I noticed the following in the 3.0: ```ruby /foo/.frozen? # => true (1..3).frozen? # => true # but... Regexp.new('foo').frozen? # => false # ...whereupon Range.new(1, 3).frozen? # => true ``` I'd like to understand, what is there a reason for non-literal regexps to not being frozen, and for ranges to be? Corresponding tickets (#16377 and #15504) doesn't clarify the reasoning: > For the record: `Regexp.new` should continue to return unfrozen Regexp instance. (@mame at #16377#note-7) and: > I'm for freezing all Ranges, not only Range literals. I hate the idea of freezing only literals because casually mixing frozen and unfrozen objects leads to hard-to-debug bugs that depend upon data flow. (@mame at #15504#note-3) I understand that the matter is probably negligible, but will be very grateful for some explanations. -- https://bugs.ruby-lang.org/ Unsubscribe: