On Friday, April 22, 2011 10:32:35 AM UTC-6, DK wrote:
>
> Just curious if there is a more elegant way to set a variable if it happens
> to not exist yet. I often find I am doing somthing like the following:
>
> regex = ''
> 10.times { regex += '.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*\n' }
>
> Is there some prettier way to within the second line create the variable if
> it does not exist yet? The above just looks ugly. I know I could use a class
> variable but that also does not seem right as I do not need it to be a class
> variable:
>
> 10.times { @regex += '.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*,.*\n' }
>
>
Having no idea what the context is I'll try to answer:
Since the code where you're modifying your variable is w/in a block, any
variables referenced therein that don't already exist (outside the block)
won't exist outside the block once after it has run:
> $ cat test.rb
> 1.times { hi = "hello" }
> defined?(hi) ? hi += " bye" : hi = "NOT DEFINED"
> puts hi
> $ ruby test.rb
> NOT DEFINED
Thus, for your block to have any effect on local variables that exist in the
enclosing scope these variables must already "exist" before the block. This
means the parser must see the local variable (in some context where it is
clear it is a local variable and not a method call, such as in an assignment
statement) before the block definition in the enclosing scope.
So, assuming I understand your intent, the answer is no. The local must
already be defined (whether initialized with an actual value is another
matter (*see example below)) or you should use an instance, class, or
global.
* (
> $ cat test.rb
> hi = nil if false # defines hi even though assignment never executed
> 1.times { hi = "hello" }
> defined?(hi) ? hi += " bye" : hi = "NOT DEFINED"
> puts hi
> $ ruby test.rb
> hello bye
I don't know if this helps any or not...
--
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en.