From: Robert Dober Date: 2007-03-12T19:44:49+09:00 Subject: Re: #define alternative for Ruby On 3/12/07, Brian Candler wrote: > On Mon, Mar 12, 2007 at 06:05:25PM +0900, Mike wrote: > > > > Imagine you would call the function with rand() as parameter. With #define > > > > value would be used three times. > > > > > > ??? > > > > > > irb(main):001:0> def myfunc(x); Math.sin(x)*Math.cos(x)*Math.exp(x); end > > > => nil > > > irb(main):002:0> p myfunc(rand) > > > 0.44720293351854 > > > => nil > > > irb(main):003:0> p myfunc(rand) > > > 1.07121692170638 > > > => nil > > > irb(main):004:0> p myfunc(rand) > > > 1.01827292445777 > > > => nil > > > > > > Now, if you *store* the value of rand within the function, that's a > > > different case. But Ruby has different idioms for deferred execution: one of > > > those is > > > > > > class Foo > > > def initialize(&blk) > > > @gen = blk > > > end > > > def value > > > @gen.call > > > end > > > end > > > > > > a = Foo.new { rand } > > > puts a.value > > > puts a.value > > > puts a.value > > > > Just try to implement: > > set_default(var, val) > > -- if variable "var" is not defined (not existed) then assign value > > "val" > > I think we have a stuck record here :-) > > For this particular example, the code you are looking for is: > > var ||= val Please note that var ||= val is not the same than var = val unless defined? var Very often it is preferable of course. Robert