S
Sam Kong
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
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