From: "jeremyevans0 (Jeremy Evans)" Date: 2022-07-30T22:55:25+00:00 Subject: [ruby-core:109388] [Ruby master Feature#18930] Officially deprecate class variables Issue #18930 has been updated by jeremyevans0 (Jeremy Evans). austin (Austin Ziegler) wrote in #note-9: > If we���re going to deprecate them, we need something that effectively replaces them���and class instance variables aren���t it. The particular approach given may not work (I don't see how it tries to replace class variables), but that doesn't mean you cannot replace class variables with class instance variables. There are a couple approaches, depending on the behavior you want. The first approach is copying the instance variables from the superclass to the subclass during subclassing in inherited: ```ruby def self.inherited(klass) super @class_variable = klass.instance_variable_get(:@class_variable) end ``` This approach results in being able to access the class instance variable directly in the subclass. It provides the fastest access, with the tradeoff of slower subclassing and making future changes to the superclass not affecting subclasses that do not override the variable. An alternative approach replaces the class variable with a class instance variable and a singleton method: ```ruby def self.class_variable defined?(@class_variable) ? @class_variable : superclass.class_variable end ``` This results in slower access, but offers faster subclassing and makes it so future changes to the superclass affect subclasses that do not override the variable. I should be clear that either way does not attempt to implement the weird semantics of class variables, where setting the variable in a subclass sets it for the entire class hierarchy (up to the superclass that defined the variable). I don't think almost anyone actually wants those semantics. > Yes, in this case, I could *probably* switch to a constant (even a private constant), but that also feels wrong. For a constant value and not a variable value, I recommend using a constant. ---------------------------------------- Feature #18930: Officially deprecate class variables https://bugs.ruby-lang.org/issues/18930#change-98537 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal ---------------------------------------- Ruby's class variables are very confusing, and it seem many people agree they should be avoided (#18927). How about we deprecate them officially? Concretely: * Mention in the documentation that class variables are deprecated and should be avoided/should not be used. * Add a parse-time deprecation warning, now that we only see those with `Warning[:deprecation] = true` it seems reasonable to add. -- https://bugs.ruby-lang.org/ Unsubscribe: