|
Prev: meaning of %w
Next: in select: interrupt
From: Marc Heiler on 1 Jul 2008 05:45 Is there any way in ruby to create dynamic variables? counter = 52 box#{counter} = "cat and dogs" There would be then a new variable box52 Note that this is not a question whether someone should do it or not - this is solely whether it is doable or not. Until today I thought it is somehow possible with eval but I failed, so I assume it is not possible. -- Posted via http://www.ruby-forum.com/.
From: Igal Koshevoy on 1 Jul 2008 05:52 Marc Heiler wrote: > Is there any way in ruby to create dynamic variables? > > counter = 52 > box#{counter} = "cat and dogs" > > There would be then a new variable > box52 > > Note that this is not a question whether someone should do it or not - > this is solely whether it is doable or not. Until today I thought it is > somehow possible with eval but I failed, so I assume it is not possible. > irb(main):010:0> counter = 52 => 52 irb(main):011:0> eval "box#{counter} = 'cat and dogs'" => "cat and dogs" irb(main):012:0> box52 => "cat and dogs" -igal
From: Calamitas on 1 Jul 2008 06:12 On Tue, Jul 1, 2008 at 11:52 AM, Igal Koshevoy <igal(a)pragmaticraft.com> wrote: > Marc Heiler wrote: >> >> Is there any way in ruby to create dynamic variables? >> >> counter = 52 >> box#{counter} = "cat and dogs" >> >> There would be then a new variable >> box52 >> >> Note that this is not a question whether someone should do it or not - >> this is solely whether it is doable or not. Until today I thought it is >> somehow possible with eval but I failed, so I assume it is not possible. >> > > irb(main):010:0> counter = 52 > => 52 > irb(main):011:0> eval "box#{counter} = 'cat and dogs'" > => "cat and dogs" > irb(main):012:0> box52 > => "cat and dogs" Now try the same thing in plain ruby without irb. Never trust irb on things like these. Dynamic variables as created by eval live in a separate, eval-specific scope and can only be accessed through eval. This is a consequence of Ruby deciding at "compile" time what's a local variable and what's not. So, if you have code like this: eval "a = 5" p a then in "p a", a is determined to be a method call before that code is even run. The a is accessible through eval though: eval "a = 5" p eval("a") Peter
From: Frederick Cheung on 1 Jul 2008 06:12 On 1 Jul 2008, at 10:52, Igal Koshevoy wrote: > Marc Heiler wrote: >> Is there any way in ruby to create dynamic variables? >> >> counter = 52 >> box#{counter} = "cat and dogs" >> >> There would be then a new variable >> box52 >> >> Note that this is not a question whether someone should do it or >> not - >> this is solely whether it is doable or not. Until today I thought >> it is >> somehow possible with eval but I failed, so I assume it is not >> possible. >> > irb(main):010:0> counter = 52 > => 52 > irb(main):011:0> eval "box#{counter} = 'cat and dogs'" > => "cat and dogs" > irb(main):012:0> box52 > => "cat and dogs" > Although that doesn't work outside of irb. (although you can change the value of an existing local variable like that) See also http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/a954f8aaf698a0b9/e1c761b71b63b82e?#e1c761b71b63b82e Fred
From: Igal Koshevoy on 1 Jul 2008 08:00
Frederick Cheung wrote: > > On 1 Jul 2008, at 10:52, Igal Koshevoy wrote: > >> irb(main):010:0> counter = 52 >> => 52 >> irb(main):011:0> eval "box#{counter} = 'cat and dogs'" >> => "cat and dogs" >> irb(main):012:0> box52 >> => "cat and dogs" >> > Although that doesn't work outside of irb. (although you can change > the value of an existing local variable like that) > See also > http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/a954f8aaf698a0b9/e1c761b71b63b82e?#e1c761b71b63b82e > > Thanks for catching the mistake and providing the link. So there really is no way to get the "box52" variable directly? It's only available within the context of an eval? When I run the code below directly (not from IRB), the interpreter is clearly seeing the "box52" local variable and keeping its state around, but won't let me access it without wrapping an eval around it, which seems wrong: counter = 52 p local_variables # => ["counter"] eval "box#{counter} = 'cat and dogs'" p local_variables # => ["counter", "box52"] p eval("box52") # => "cat and dogs" p box52 # => undefined local variable or method `box52' for main:Object (NameError) I say "seems wrong" because I'm used to the following behavior: # Python counter = 52 eval(compile('box%s = "cat and dogs"' % counter, '<string>', 'exec')) print box52 # => "cat and dogs" # Perl $counter = 52; eval("\$box$counter = 'cat and dogs'"); print $box52, "\n"; # => "cat and dogs" -igal |