Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Ruby (http://www.velocityreviews.com/forums/f66-ruby.html)
-   -   Why can't I define vars in caller's binding using eval? (http://www.velocityreviews.com/forums/t850482-why-cant-i-define-vars-in-callers-binding-using-eval.html)

Christopher J. Bottaro 05-22-2008 03:38 AM

Why can't I define vars in caller's binding using eval?
 
In other words, why can't I do this?

def f(b)
eval("x = 10", b)
end

f(binding)
puts "x = #{x}"

Is there any way to make that code work (besides obviously setting x
to something before calling f).

Thanks.


Andrew Mitchell 05-23-2008 08:39 AM

Re: Why can't I define vars in caller's binding using eval?
 
Christopher J. Bottaro wrote:
> In other words, why can't I do this?
>
> def f(b)
> eval("x = 10", b)
> end
>
> f(binding)
> puts "x = #{x}"
>
> Is there any way to make that code work (besides obviously setting x
> to something before calling f).
>
> Thanks.


Worked for me.

Dios:~ andrewmitchell$ irb
>> def f(b)
>> eval("x=10", b)
>> end

=> nil
>> f(binding)

=> 10
>> puts "x = #{x}"

x = 10
=> nil
>>

--
Posted via http://www.ruby-forum.com/.


Heesob Park 05-23-2008 09:13 AM

Re: Why can't I define vars in caller's binding using eval?
 
2008/5/23 Andrew Mitchell <amitchell@ttcent.com>:
> Christopher J. Bottaro wrote:
>> In other words, why can't I do this?
>>
>> def f(b)
>> eval("x = 10", b)
>> end
>>
>> f(binding)
>> puts "x = #{x}"
>>
>> Is there any way to make that code work (besides obviously setting x
>> to something before calling f).
>>
>> Thanks.

>
> Worked for me.
>
> Dios:~ andrewmitchell$ irb
>>> def f(b)
>>> eval("x=10", b)
>>> end

> => nil
>>> f(binding)

> => 10
>>> puts "x = #{x}"

> x = 10
> => nil
>>>

But it works only in irb.

Regards,

Park Heesob


Florian Gilcher 05-23-2008 10:20 AM

Re: Why can't I define vars in caller's binding using eval?
 
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

As far as i know, this is because local variables have a lexical scope.

In my experience, the parser treats everything that was not mentioned
as a
local variable before a method call and the runtime doesn't check
whether
it is a variable.

This also explains why IRB works differently, as every statement is
compiled
as a single statement.

Because of this, it is also impossible to assume the existance of
local variables
when executing a Proc in a certain context. (without considering hefty
AST-Hacking
with ruby2ruby).


Regards,
Florian Gilcher

On May 23, 2008, at 11:13 AM, Heesob Park wrote:

> 2008/5/23 Andrew Mitchell <amitchell@ttcent.com>:
>> Christopher J. Bottaro wrote:
>>> In other words, why can't I do this?
>>>
>>> def f(b)
>>> eval("x = 10", b)
>>> end
>>>
>>> f(binding)
>>> puts "x = #{x}"
>>>
>>> Is there any way to make that code work (besides obviously setting x
>>> to something before calling f).
>>>
>>> Thanks.

>>
>> Worked for me.
>>
>> Dios:~ andrewmitchell$ irb
>>>> def f(b)
>>>> eval("x=10", b)
>>>> end

>> => nil
>>>> f(binding)

>> => 10
>>>> puts "x = #{x}"

>> x = 10
>> => nil
>>>>

> But it works only in irb.
>
> Regards,
>
> Park Heesob
>


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)

iEYEARECAAYFAkg2mlsACgkQJA/zY0IIRZblSQCcD4TmWh+ebQ0bF31AZw76wfoq
eN4Ani+na9Sg2SQaN9aGMFS73f8xKOVs
=zFM7
-----END PGP SIGNATURE-----



All times are GMT. The time now is 08:03 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.