Idiomas Ruby: memoização
Este curso trata do operador ||= do Ruby e de como ele sustenta a memoização. Começa pela expansão de x ||= value em x || (x = value) e explica por que isso funciona numa variável nunca atribuída. Depois separa os valores padrão em partials e helpers Rails do cache de um resultado num objeto. Contadores de chamada mostram a memoização rodando um passo caro uma vez. Em seguida, o curso mostra por que o ||= não memoiza false nem nil e corrige isso com defined?. No fim, aponta os casos em que memoizar traz complexidade ou dado velho.
O que você vai aprender
- ✓Como x ||= value se expande em x || (x = value) e funciona em variáveis não atribuídas
- ✓A diferença entre ||= para valores padrão e memoização
- ✓Guardar um resultado caro numa variável de instância com @ivar ||=
- ✓Por que @value ||= false recalcula a cada chamada
- ✓Usar defined?(@ivar) para memoizar valores que podem ser false ou nil
- ✓Quando a memoização não compensa e como valores em cache ficam velhos
O que ||= faz
||= parece uma sintaxe própria, mas junta duas coisas de cursos anteriores: || (OU com curto-circuito) e = (atribuição). x ||= 5 funciona assim:
Ler a aula completa grátis →Currículo
7 aulasO que ||= faz
Como x ||= value vira x || (x = value) e funciona em locais e variáveis de instância não atribuídas.
||= para valores padrão
Usos de ||= em partials e helpers desta app que dão valores padrão sem guardar nada num objeto.
Memoização: cacheando a primeira chamada
A memoização guarda um resultado caro numa variável de instância, e um contador mostra que ele roda uma vez.
A armadilha do false/nil na memoização
Por que @value ||= false recalcula a cada chamada: false é falsy e o ||= só checa truthiness.
O conserto com defined?
Usar defined?(@ivar) para checar se a variável foi atribuída, de modo que false e nil fiquem memoizados.
Quando memoizar, e quando não
Quando a memoização custa mais do que economiza, como o cache fica velho e uma lista de três perguntas.
Juntando tudo sobre memoização
Revisão do curso inteiro, da expansão do ||= à correção com defined? e aos limites da memoização.