From: "Wolfgang Nádasi-Donner" Date: 2007-08-17T05:18:09+09:00 Subject: Re: Lazy function definition pattern in Ruby? Sam Kong wrote: > Hi, > > Yesterday, I read a blog about lazy function definition pattern in > JavaScript at http://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 via http://www.ruby-forum.com/.