Set Ruby variable if it is not already defined Set Ruby variable if it is not already defined ruby ruby

Set Ruby variable if it is not already defined


While x ||= value is a way to say "if x contains a falsey value, including nil (which is implicit in this construct if x is not defined because it appears on the left hand side of the assignment), assign value to x", it does just that.

It is roughly equivalent to the following. (However, x ||= value will not throw a NameError like this code may and it will always assign a value to x as this code does not -- the point is to see x ||= value works the same for any falsey value in x, including the "default" nil value):

if !x  x = valueend  

To see if the variable has truly not been assigned a value, use the defined? method:

>> defined? z=> nil                                                                  >> z = nil                                                              => nil                                                                  >> defined? z                                                           => "local-variable"                                                     >> defined? @z                                                          => nil                                                                  >> @z = nil                                                             => nil                                                                  >> defined? @z                                                          => "instance-variable" 

However, in almost every case, using defined? is code smell. Be careful with power. Do the sensible thing: give variables values before trying to use them :)

Happy coding.


@variable ||= "set value if not set"

So false variables will get overridden

> @test = true  => true > @test ||= "test" => true > @test  => nil > @test ||= "test" => "test" > @test = false  => false > @test ||= "test" => "test" 


As you didn't specify what kind of variable:

v = vv ||= 1

Don't recommend doing this with local variables though.

Edit: In fact v=v is not needed