Project

General

Profile

Bug #11022

opening an eigenclass does not change the class variable definition context

Added by bughit (bug hit) over 4 years ago. Updated 27 days ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 2.2.1p85 (2015-02-26 revision 49769) [i686-linux]
[ruby-core:<unknown>]

Description

module Mod1

  class << Object.new

    C = 1
    @@cv = 1

    p Module.nesting,
      constants(false),
      class_variables(false),
      Mod1.class_variables(false)

  end

end
[#<Class:#<Object:0xb6913d98>>, Mod1]
[:C]
[]
[:@@cv]

Shouldn't class var resolution be relative to the current lexical class (Module.nexting.first)?

History

#1

Updated by bughit (bug hit) over 4 years ago

Module.nesting.first

I would think it would be unexpected for most, that a class variable is not being defined in the currently open class.

Updated by jeremyevans0 (Jeremy Evans) about 1 month ago

This issue is not specific to opening a singleton class (class <<), but applies to any case where the class being opened is a singleton class. You get the same output for:

module Mod1
  O = Object.new.singleton_class
  class O
    C = 1
    @@cv = 1
    p Module.nesting,
      constants(false),
      class_variables(false),
      Mod1.class_variables(false)
  end
end

This explains why it works for nil (and presumably true and false):

module Mod1
  class << nil
    C = 1
    @@cv = 1
    p Module.nesting,
      constants(false),
      class_variables(false),
      Mod1.class_variables(false)
  end
end
# [NilClass, Mod1]
# [:C]
# [:@@cv]
# []

I'm not sure if this class variable behavior is a bug or spec. If you consider it a bug, and say that class variables set inside a singleton class definition are set on the singleton class and not the outer nesting, then you would probably break the following code (and I'm guessing class << self is much more common than class << some_other_object):

module Mod1
  class << self
    @@cv = 1
  end

  def a
    @@cv
  end
end

FWIW, Ruby does allow you to set class variables on singleton classes via class_variable_get/class_variable_set, but you cannot access them via normal means:

module Mod1
  singleton_class.class_variable_set(:@@cv, 1)

  class << self
    p class_variable_get(:@@cv)
    @@cv
  end
end
# 1
# NameError: uninitialized class variable @@cv in Mod1

Updated by Eregon (Benoit Daloze) about 1 month ago

Class variable lookup just ignores singleton classes currently.
I assume this is intentional behavior so one can use the same variable in singleton methods (when defined under class<<self) and instance methods.

#4

Updated by jeremyevans0 (Jeremy Evans) 27 days ago

  • Status changed from Open to Rejected

Also available in: Atom PDF