# Create variables with caller scope

**URL:** <https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458>\
**Category:** Ruby\
**Created:** [January 18, 2008, 12:02pm UTC](https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458 "2008-01-18T12:02:25Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Jari\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a698b9/32.png) [@Jari\_W](https://www.ruby-forum.com/u/Jari_W)\
**Post date:** [January 18, 2008, 12:02pm UTC](https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458/1 "2008-01-18T12:02:25Z")

</div>

Is it possible for a method to create new variables that becomes in the  
scope of the caller (instead of the scope of the method)? I guess I mean  
to get a method to behave much like macros or templates in C/C++.

## Something like this:

def create\_some\_variables(varname1, varname2)  
# Create the variables and initialize with values  
end

create\_some\_variables(“a”, “b”)

# Display the values of those variables

## puts a puts b

mvh/  
Jari W.

---

<div class="post-metadata">

**Author:** ![Jari\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a698b9/32.png) [@Jari\_W](https://www.ruby-forum.com/u/Jari_W)\
**Post date:** [January 18, 2008, 1:16pm UTC](https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458/2 "2008-01-18T13:16:20Z")

</div>

Jari W. :

> Is it possible for a method to create new variables that  
> becomes in the scope of the caller (instead of the scope  
> of the method)? I guess I mean to get a method to behave  
> much like macros or templates in C/C++.

Why not using a block ?

> ## Something like this:
> 
> def create\_some\_variables(varname1, varname2)  
> # Create the variables and initialize with values  
> end

def create\_some\_variables(\*args)

# Create object\_1 and object\_2 and initialize with values

# …

# pass them to the block

yield object\_1, object\_2 if block\_given?  
end

> create\_some\_variables(“a”, “b”)
> 
> # Display the values of those variables
> 
> puts a  
> puts b

create\_some\_variables(…) do |a,b|

# Display the values of those variables

puts a  
puts b

# do something with a and b

# …

end

```
-- Jean-François.
```

---

<div class="post-metadata">

**Author:** ![Jari\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a698b9/32.png) [@Jari\_W](https://www.ruby-forum.com/u/Jari_W)\
**Post date:** [January 18, 2008, 1:28pm UTC](https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458/3 "2008-01-18T13:28:40Z")

</div>

Jean-François Trân wrote:

> Jari W. :
> 
> > Is it possible for a method to create new variables that  
> > becomes in the scope of the caller (instead of the scope  
> > of the method)? I guess I mean to get a method to behave  
> > much like macros or templates in C/C++.
> 
> Why not using a block ?

Because the created variables will “only” get block scope, if I  
understand your sample code correctly. And calling the  
create\_some\_variables() multiple times would create multiple stacked  
blocks.

But giving it a bit more thought, I think I should redesign the code a  
bit and let the method instead dynamically create a class where all the  
created variables are stored and then returned an instance of that  
class.

Best regards,

Jari W.

---

<div class="post-metadata">

**Author:** ![Jari\_W](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a698b9/32.png) [@Jari\_W](https://www.ruby-forum.com/u/Jari_W)\
**Post date:** [January 18, 2008, 1:39pm UTC](https://www.ruby-forum.com/t/create-variables-with-caller-scope/126458/4 "2008-01-18T13:39:17Z")

</div>

2008/1/18, Jari W. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> understand your sample code correctly. And calling the  
> create\_some\_variables() multiple times would create multiple stacked blocks.
> 
> But giving it a bit more thought, I think I should redesign the code a  
> bit and let the method instead dynamically create a class where all the  
> created variables are stored and then returned an instance of that class.

OpenStruct and Hash come to mind. One of those is usually far better  
than the hack you attempted initially. Btw, there is another issue  
with this: local variables created dynamically in a scope cannot be  
used directly (i.e. the same way as if they were defined in the scope  
directly):

$ ruby -e ‘def f() eval(“x=1”, binding); p x end; f’  
-e:1:in `f': undefined local variable or method `x’ for main:Object  
(NameError)  
from -e:1  
13:35:55 /cygdrive/c/SCMws/RKlemme/OPSC\_Gold\_bas\_dev\_R1.2\_perf/bas  
$ ruby -e ‘def f() eval(“x=1”, binding); p(eval(“x”, binding)) end; f’  
1  
13:36:27 /cygdrive/c/SCMws/RKlemme/OPSC\_Gold\_bas\_dev\_R1.2\_perf/bas

So you need to use some name passing mechanism anyway. And if you do  
that you can use a Hash immediately which is much easier and clearer.

Kind regards

robert
