From: daniel@...42.com Date: 2019-12-11T14:54:11+00:00 Subject: [ruby-core:96204] [Ruby master Feature#16377] Regexp literals should be frozen Issue #16377 has been updated by Dan0042 (Daniel DeLorme). I really hope this does not go through. Regexp literals have been "unduplicated" like this since at least 1.8 and we've never had problems. And now we should freeze them and introduce an incompatibility just for the sake of Communicating the Holy Gospel of Immutability? I don't find that a valid reason. Additionaly, Regexp literals are not deduplicated in the same sense as frozen string literals; one `/abc/` is independant from another `/abc/` so we're not actually leaking "global" state. In the example above the state is local to the method but shared between invocations. Not sure how that should be called, but certainly not "global". And what if the `mutate` behavior shown above is actually wanted? Sure it's a hack, but it's a bit like function-static variables in php. Or, more realistically, what about something like this? ```ruby class Regexp def analyze @analyze ||= RegexpAnalyzer.analyze_performance_issues(self) end end ``` Freezing objects closes off possibilities when it's done by default, and should only be done when absolutely necessary. ---------------------------------------- Feature #16377: Regexp literals should be frozen https://bugs.ruby-lang.org/issues/16377#change-83093 * Author: byroot (Jean Boussier) * Status: Open * Priority: Normal * Assignee: * Target version: ---------------------------------------- The following script: ```ruby def mutate re = /foo/ state = re.instance_variable_get(:@state) re.instance_variable_set(:@state, state.to_i + 1) state end 3.times do p mutate end ``` Output this: ``` nil 1 2 ``` IMHO, you shouldn't be able to mutate an unduplicated literal. GitHub pull request: https://github.com/ruby/ruby/pull/2705 -- https://bugs.ruby-lang.org/ Unsubscribe: