Project

General

Profile

Actions

Bug #19269

closed

Constant lookup and #instance_eval

Added by andrykonchin (Andrew Konchin) over 2 years ago. Updated over 2 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:111451]

Description

I've noticed a confusing behaviour of #instance_eval (and #instance_exec as well). In some cases it doesn't see constants defined in the object class.

Examples:

C = 1

class A
  C = 2
end

When #instance_eval is called with a String - A::C constant is visible, that is pretty expected:

A.new.instance_eval("C") # => 2

But when it's called with a block - A::C isn't visible:

A.new.instance_eval { C } # => 1

If we define a method that returns a constant (defined in the class), then A::C is visible in both cases:

C = 1

class A
  C = 2
  def c; C; end
end

A.new.instance_eval("c") # => 2
A.new.instance_eval { c } # => 2

So we see that when #instance_eval called with a block and a constant is accessed directly is the only case when a class constant isn't visible.

Wondering whether it's an expected behaviour and the reason to behave this way.


In the examples above I've added a top-level declaration C=1 only for readability. Without this declaration in all the cases when C value 1 is returned - a NoName exception is raised (uninitialized constant C (NameError))


Related issues 1 (0 open1 closed)

Has duplicate Ruby - Bug #19270: Constants lookup and a singleton class issueClosedActions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0