Bug #7475
Unexpected behavior of Module#append_features on singleton class
Description
=begin
A more involved explanation is available at ((URL:http://erniemiller.org/2012/11/29/ruby-tidbit-include-vs-extend-with-module-class-variables/))
In short, the handling of class variables (and constants) when a module is extended vs included is not as expected.
Example:
module Foo @@foo = 'foo' end class Bar include Foo end class Baz extend Foo end Bar.class_variable_get :@@foo # => "foo" Baz.singleton_class.class_variable_get :@@foo # => NameError: uninitialized class variable @@foo in Class
We would expect constant and class variable lookup on the singleton class to work, but it doesn't. Both Rubinius and JRuby seem to behave as expected in this case.
Thanks!
=end
History
#1
[ruby-core:50394]
Updated by ernie (Ernie Miller) over 5 years ago
Another quick set of observations from this morning:
class Baz class << self Const = 'Const' @@foo = 'foo' end end Baz.class_variables.inspect # => [:@@foo] Baz.singleton_class.class_variables.inspect # => [] Baz.singleton_class.class_variable_get :@@foo # => 'foo' ??? Baz.const_get(:Const, false) rescue "Nope." # => 'Nope.' Baz.singleton_class.const_get(:Const, false) rescue "Nope." # => Const # Let's try setting it explicitly. Baz.singleton_class.class_variable_set :@@foo, 'foo' Baz.singleton_class.class_variables.inspect # => [] -- still "empty"
However, if we extend Foo on Baz, vs opening the singleton class with "class << self", we can class_variable_set on the singleton and see it show up in the list of class variables, vs being empty.
All of this is to say that I think some unexpected weirdness is going on in rb_include_module and/or include_class_new.
#2
[ruby-core:52405]
Updated by ko1 (Koichi Sasada) about 5 years ago
- Assignee set to matz (Yukihiro Matsumoto)
- Target version changed from 1.9.3 to 2.6
Matz, could you check it?
#3
[ruby-core:52425]
Updated by nobu (Nobuyoshi Nakada) about 5 years ago
- Description updated (diff)
#4
Updated by naruse (Yui NARUSE) 4 months ago
- Target version deleted (
2.6)