Já teve que fazer métodos que fazem testes para serem executados somente uma vez? Uma espécie de cache de métodos, então, lendo um artigo aí e me arriscando nessa tal de metaprogramação consegui criar minha própria solução, simples e elegante, sem precisar avaliar (eval) uma string. Embaixo código demonstrando.
class Module
def once(*methods)
methods.each do |method|
method = method.to_sym;
emethod = self.instance_method(method);
self.send(:define_method, method) do |*args|
@cached_methods ||= {};
@cached_methods[method] ||= emethod.bind(self).call(*args);
end
end
end
end
class Person
def hello(name)
"Hello, #{name}"
end
def walk
puts "Walking..."
"Here!"
end
once :hello, :walk
end
someone = Person.new
someone.hello "Bernardo" #=> "Hello, Bernardo"
someone.hello "World" #=> "Hello, Bernardo"
someone.walk #Will print "Walking..." and return "Here!"
someone.walk #Just return "Here!"
Powered by ScribeFire.

Setembro, 1 - 2007 às 11:58 pm |
Dê uma procurada por memoization. Inclusive, existe um gem pra isso.
Setembro, 2 - 2007 às 11:23 am |
Hmm… Nem sabia da existência, valeu a dica!