From: justin@... Date: 2019-01-14T17:37:31+00:00 Subject: [ruby-core:91085] [Ruby trunk Bug#8297] extend & inherited class variable issue Issue #8297 has been updated by jsc (Justin Collins). This appears to still be an issue with Ruby 2.6.0 (ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]): Example: ~~~ module M @@xyz = 123 end puts "M.class_variables: #{M.class_variables.inspect}" puts "M.class_variable_get :@@xyz: #{M.class_variable_get :@@xyz}" class C extend M end puts "C.class_variables: #{C.class_variables.inspect}" puts "C.class_variable_get :@@xyz: #{C.class_variable_get :@@xyz}" ~~~ Output: ~~~ M.class_variables: [:@@xyz] M.class_variable_get :@@xyz: 123 C.class_variables: [] Traceback (most recent call last): 1: from 8297.rb:13:in `
' 8297.rb:13:in `class_variable_get': uninitialized class variable @@xyz in C (NameError) ~~~ ---------------------------------------- Bug #8297: extend & inherited class variable issue https://bugs.ruby-lang.org/issues/8297#change-76313 * Author: dunric (David Unric) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: 2.0.0p0 * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN ---------------------------------------- =begin By the current documentation, (({Object#extend})) method has to (only) add instance methods of a module given as a parameter. In the following example, the class ((|C|)) is extended with module ((|M|)). By (({class_variables})) method sent to singleton class of C also did inherit class variable ((|@@xyz|)). However when inherited ((|@@xyz|)) is accessed, (({NameError})) exception is raised as it is was not initialized. module M @@xyz = 123 end M.class_variables # [:@@xyz] M.class_variable_get :@@xyz # 123 , so far so good class C extend M end p C.singleton_class.class_variables # [:@@xyz] p C.singleton_class.class_variable_get :@@xyz # NameError exception Either (({class_variables})) returns invalid array - ie. ((|@@xyz|)) was not inherited at all or (({class_variable_get})) ignores class variables inherited from module (when sent to a singleton). =end Prior Ruby versions like 1.9.3p392 does not suffer this issue as return with Module#class_variables returns an empty array. -- https://bugs.ruby-lang.org/ Unsubscribe: