Forum: Ruby eval and dynamic local variable creation in Ruby 1.8 vs 1.9

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.
64ce140d1f35debb5f64645eb8722f22?d=identicon&s=25 Thairuby TH (thairuby)
on 2008-06-08 12:57
I tested this script with "Try Ruby! (in your browser)"
(http://tryruby.hobix.com/).

>> RUBY_VERSION
=> "1.8"
>> eval "a=1"
=> 1
>> a
=> 1

It is the same as my expectation. But when I try with Ruby 1.9 in my
computer...

irb(main):001:0> RUBY_VERSION
=> "1.9.0"
irb(main):002:0> eval "a=1"
=> 1
irb(main):003:0> a
NameError: undefined local variable or method `a' for main:Object
...


I read from somewhere that now Ruby can't dynamically create local
variable. Is it true or just a bug?
Sorry with my poor english.
Ede2aa10c6462f1d825143879be59e38?d=identicon&s=25 Charles Oliver Nutter (Guest)
on 2008-06-08 19:07
(Received via mailing list)
Thairuby Thairuby wrote:
> I read from somewhere that now Ruby can't dynamically create local
> variable. Is it true or just a bug?
> Sorry with my poor english.

In Ruby 1.8, all evals under a given scope (like, at the same scoped
level in a method) used the same shared local variable scope. That scope
grew as needed to accommodate new variables.

In Ruby 1.9, every eval gets its own scope. This provides better
isolation between evals, which has both positive and negative side
effects. On the positive side, the code inside an eval can use a faster
representation of local variables that doesn't depend on being able to
grow. On the negative side, you can't do things like this anymore:

eval "a = 1"
eval "puts a"

- Charlie
0ec4920185b657a03edf01fff96b4e9b?d=identicon&s=25 Yukihiro Matsumoto (Guest)
on 2008-06-08 19:19
(Received via mailing list)
Hi,

In message "Re: eval and dynamic local variable creation in Ruby 1.8 vs
1.9"
    on Sun, 8 Jun 2008 19:56:25 +0900, Thairuby Thairuby
<kabkab@doramail.com> writes:

|I tested this script with "Try Ruby! (in your browser)"
|(http://tryruby.hobix.com/).
|
|>> RUBY_VERSION
|=> "1.8"
|>> eval "a=1"
|=> 1
|>> a
|=> 1
|
|It is the same as my expectation. But when I try with Ruby 1.9 in my
|computer...
|
|irb(main):001:0> RUBY_VERSION
|=> "1.9.0"
|irb(main):002:0> eval "a=1"
|=> 1
|irb(main):003:0> a
|NameError: undefined local variable or method `a' for main:Object
|...
|
|I read from somewhere that now Ruby can't dynamically create local
|variable. Is it true or just a bug?

The local variables are created in compile time, so that local
variables that are defined in eval() cannot be accessed outside of
eval.  In 1.8, irb and tryruby does line by line compilation so that
local variables are spilled from eval(), but in 1.9, it's strictly
prohibited even under line-by-line compilation.

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