Forum: Ruby access to constants from instance_eval

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
David C. (Guest)
on 2007-02-08 13:47
(Received via mailing list)
Hi all,

It seems that Ruby won't allow me to directly access class constants
from instance_eval:

irb(main):001:0> class Foo
irb(main):002:1>   BAR = "bar"
irb(main):003:1>   def bar
irb(main):004:2>     BAR
irb(main):005:2>   end
irb(main):006:1> end
=> nil
irb(main):007:0> foo = Foo.new
=> #<Foo:0x10d97f0>
irb(main):008:0> foo.class.constants
=> ["BAR"]
irb(main):009:0> foo.bar
=> "bar"
irb(main):010:0> foo.instance_eval { bar }
=> "bar"
irb(main):011:0> foo.instance_eval { BAR }
NameError: uninitialized constant BAR
        from (irb):11
        from (irb):11:in `instance_eval'
        from (irb):11

Can anybody explain to me why this might be the case (is there a
philosophical reason that this is correct?) and/or some meta-magic
spell I can use to coerce instance_eval into recognizing foo's
constants?

Thanks,
David
unknown (Guest)
on 2007-02-08 14:19
(Received via mailing list)
Hi --

On Thu, 8 Feb 2007, David C. wrote:

> irb(main):006:1> end
> NameError: uninitialized constant BAR
>       from (irb):11
>       from (irb):11:in `instance_eval'
>       from (irb):11
>
> Can anybody explain to me why this might be the case (is there a
> philosophical reason that this is correct?) and/or some meta-magic
> spell I can use to coerce instance_eval into recognizing foo's
> constants?

foo doesn't have any constants; only Foo does.  instance_eval changes
self, but it's still in the same scope.  So the constants available
inside the block are the same as those available outside the block.

(You can see foo's instance variables, if any, inside the block, but
that's because the visibility of instance variables depends on
'self'.)


David
James G. (Guest)
on 2007-02-08 15:07
(Received via mailing list)
On Feb 8, 2007, at 5:46 AM, David C. wrote:

> irb(main):006:1> end
> NameError: uninitialized constant BAR
>        from (irb):11
>        from (irb):11:in `instance_eval'
>        from (irb):11
>
> Can anybody explain to me why this might be the case (is there a
> philosophical reason that this is correct?) and/or some meta-magic
> spell I can use to coerce instance_eval into recognizing foo's
> constants?

I doubt this is what you are after, but:

 >> class Foo
 >>   BAR = "bar"
 >>   def bar
 >>     BAR
 >>   end
 >> end
=> nil
 >> foo = Foo.new
=> #<Foo:0x11004cc>
 >> foo.instance_eval { self.class.const_get(:BAR) }
=> "bar"

James Edward G. II
Bertram S. (Guest)
on 2007-02-08 15:08
(Received via mailing list)
Hi,

Am Donnerstag, 08. Feb 2007, 21:18:40 +0900 schrieb 
removed_email_address@domain.invalid:
> >NameError: uninitialized constant BAR
>
> foo doesn't have any constants; only Foo does.  instance_eval changes
> self, but it's still in the same scope.  So the constants available
> inside the block are the same as those available outside the block.

`Scope' is not neccessarily "self":

  irb(main):001:0> class C ; X = "i" ; end
  => "i"
  irb(main):002:0> X = "o"
  => "o"
  irb(main):003:0> C.instance_eval { X }
  => "o"
  irb(main):004:0> C.class_eval { X }
  => "o"
  irb(main):005:0> C.instance_eval { self::X }
  => "i"
  irb(main):006:0> C.class_eval { self::X }
  => "i"
  irb(main):007:0>

Is there a documentation that explains the differences between "scope",
"context", "self" and whatelse?

Bertram
This topic is locked and can not be replied to.