Method Caching

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.

Anúncios

2 Responses to Method Caching

  1. Walter Cruz disse:

    Dê uma procurada por memoization. Inclusive, existe um gem pra isso.

  2. Hmm… Nem sabia da existência, valeu a dica!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: