From: Sam Kong Date: 2007-08-17T06:04:58+09:00 Subject: Re: Lazy function definition pattern in Ruby? On Aug 16, 1:18 pm, "Wolfgang N�dasi-Donner" wrote: > Sam Kong wrote: > > Hi, > > > Yesterday, I read a blog about lazy function definition pattern in > > JavaScript athttp://peter.michaux.ca/article/3556. > > It was interesting and insightful. > > > > > Write a function foo that returns a Date object that holds the time > > that foo was first called. > > > var foo = function() { > > var t = new Date(); > > foo = function() { > > return t; > > }; > > return foo(); > > }; > > > > > In ruby, one would write the following way or something like that if > > he wants to cache the first value. > > > def foo > > @t or (@t = Time.new) > > end > > > But the writer wants to remove the conditional part because it's run > > every time the function is called. > > JavaScript allows functions to be redefined very easily. > > I think ruby allows it but not very easily. > > > I came up with this idea. > > > class Lazy > > def method_missing *args > > if args[0] == :foo > > @t = Time.new > > class << self > > def foo > > @t > > end > > end > > return foo > > end > > end > > end > > > But I believe that ruby gurus will have better ideas. > > What would be the lazy function definition pattern in ruby? > > And do you think it's useful? > > > Thanks in advance. > > > Sam > > You can define a method inside a method directly. > > class Bar > def foo > @t = Time.new > def foo > @t > end > @t > end > end > > x=Bar.new > p x.foo # => Thu Aug 16 22:17:17 +0200 2007 > sleep 5 > p x.foo # => Thu Aug 16 22:17:17 +0200 2007 > > Wolfgang N�dasi-Donner > -- > Posted viahttp://www.ruby-forum.com/. I didn't know defining the same method in a method works. It's very similar to the one David suggested above. But the syntax is easier and more intuitive. It's almost same as JavaScript's pattern. It's good to know.^^ Thanks.