From: Robert Klemme Date: 2007-07-25T17:39:33+09:00 Subject: Re: Static variables in Ruby. 2007/7/25, Robert Dober : > On 7/24/07, Joel VanderWerf wrote: > > Nobuyoshi Nakada wrote: > > > Hi, > > > > > > At Tue, 24 Jul 2007 17:40:57 +0900, > > > Marcin Tyman wrote in [ruby-talk:261483]: > > >> Is any way to define static variables over function? As class static > > >> variables there is possible to define a static class variable as > > >> @@name_of_var. But I'm not sure if Ruby let define such variables in > > >> functions (like in C/C++) > > > > > > def foo(x) > > > (0..0).instance_eval{x,@x = @x,x} > > > x > > > end > > > 3.times{|i|p foo(i)} #=> nil, 1, 2 > > > > > > The literal object can be Float, Regexp or Bignum, but Range > > > would be faster a bit. > > > > > > > Interesting. That is because Float, Regexp, and Bignum are instantiated > > per scope, right? > > > > Sometimes a little abstraction leakage can be useful! > > > > -- > > vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407 > > > > > I did not believe this,and why should I? > But it seems to be true ;) > def foo(x) > (0..0).instance_eval{x,@x = @x,x} > x > end > > 3.times{ |i| puts foo(i) } > (0..0).instance_eval{@x=42} > 3.times{ |i| puts foo(i) } > > Run this for a pleasant surprise :) The reason why it works is this: >> def f; (0..0).object_id end => nil >> 5.times {p f} 69868270 69868270 69868270 69868270 69868270 => 5 The Ruby interpreter optimizes this when both ends are constant. >> def g(a)(0..a).object_id end => nil >> 5.times {p g(1)} 69627090 69626930 69626820 69626680 69626560 => 5 Kind regards robert