Project

General

Profile

Bug #4484

Class variables leak to Object when using class_eval

Added by pawel (PaweĊ‚ P) over 8 years ago. Updated 7 days ago.

Status:
Rejected
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
ruby 1.8.7 (2009-06-12 patchlevel 174) [i486-linux]
[ruby-core:<unknown>]

Description

=begin
The following irb session describes the problem:

String.class_eval { @@string_class_variable = 'should be only in String' }
=> "should be only in String"
"WTF?" if Object.class_variables.include? "@@string_class_variable"
=> "WTF?"

Tested on 1.8 and 1.9.
I've created the issue in "ruby-18" project because "ruby" project doesn't allow to create new issues.
=end

History

Updated by jeremyevans0 (Jeremy Evans) 7 days ago

  • Backport set to 2.5: UNKNOWN, 2.6: UNKNOWN
  • Status changed from Open to Rejected
  • Description updated (diff)
  • Project changed from Ruby 1.8 to Ruby master

This is still true in master, but I believe this is expected behavior/spec. This is similar to constants:

String.class_eval {A = 1}
Object::A
# => 1

If you want to scope constants or class variables, you need to reopen the class using class syntax:

class String
  @@string_class_variable = 'should be only in String'
  A = 1
end
Object.class_variables.include? :@@string_class_variable
# => false
Object::A
# NameError (uninitialized constant A)

Also available in: Atom PDF