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.
> 
> <snip>
> 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();
> };
> </snip>
> 
> 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/.