# Why can't I define vars in caller's binding using eval?

**URL:** <https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340>\
**Category:** Ruby\
**Created:** [May 22, 2008, 5:38am UTC](https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340 "2008-05-22T05:38:45Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Christopher\_JSBott](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ee7513/32.png) [@Christopher\_JSBott](https://www.ruby-forum.com/u/Christopher_JSBott)\
**Post date:** [May 22, 2008, 5:38am UTC](https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340/1 "2008-05-22T05:38:45Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Christopher\_JSBott](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ee7513/32.png) [@Christopher\_JSBott](https://www.ruby-forum.com/u/Christopher_JSBott)\
**Post date:** [May 23, 2008, 10:38am UTC](https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340/2 "2008-05-23T10:38:15Z")

</div>

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
> 
> >

---

<div class="post-metadata">

**Author:** ![Christopher\_JSBott](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ee7513/32.png) [@Christopher\_JSBott](https://www.ruby-forum.com/u/Christopher_JSBott)\
**Post date:** [May 23, 2008, 11:14am UTC](https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340/3 "2008-05-23T11:14:20Z")

</div>

2008/5/23 Andrew M. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> > Is there any way to make that code work (besides obviously setting x  
> > =\> nil
> > 
> > > f(binding)  
> > > =\> 10  
> > > puts “x = #{x}”  
> > > x = 10  
> > > =\> nil

But it works only in irb.

Regards,

Park H.

---

<div class="post-metadata">

**Author:** ![Christopher\_JSBott](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/ee7513/32.png) [@Christopher\_JSBott](https://www.ruby-forum.com/u/Christopher_JSBott)\
**Post date:** [May 23, 2008, 12:21pm UTC](https://www.ruby-forum.com/t/why-cant-i-define-vars-in-callers-binding-using-eval/138340/4 "2008-05-23T12:21:25Z")

</div>

-----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 G.

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

> > > > end
> 
> Park H.

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

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