¿A qué patrón de memoración Ruby se refiere ActiveSupport:: Memoizable?
ruby-on-rails-3 memoization (4)
Por lo tanto, en Rails 3.2, ActiveSupport :: Memoizable ha quedado en desuso.
El mensaje dice:
DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and
will be removed in future releases,simply use Ruby memoization
pattern instead.
Se refiere al "patrón de memorización de Ruby" (singular) como si hubiera un patrón que todos deberíamos conocer y referirnos a ...
Supongo que significan algo así como:
def my_method
@my_method ||= # ... go get the value
end
o
def my_method
return @my_method if defined?(@my_method)
@my_method = # ... go get the value
end
¿Hay algo más que me he perdido?
Aquí está el compromiso (y la discusión posterior) donde Memoizable quedó en desuso: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c
El autor defiende el @foo ||= ...
y señala este compromiso como un ejemplo para la migración: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3 .
Editar: Tenga en cuenta que no interpreto necesariamente este cambio ya que significa que todas las instancias de memoize
pueden o deben reemplazarse con este patrón. Lo leí como que Memoizable ya no es necesario / deseado en el código Rails en sí. Como lo señalan los comentarios, Memoizable es mucho más que un simple envoltorio alrededor de @foo ||= ...
Si necesita esas características, siga adelante y use Memoizable, solo tendrá que obtenerlo de otro lugar que no sea ActiveSupport (supongo que alguien va a copiar una versión de gema, si es que todavía no lo han hecho).
En base a los comentarios sobre https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c mencionada anteriormente por avaynshtok , voy con esto:
ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable }
... porque supongo que sabré cuando Memoizable
se desconecta de ActiveSupport de mi suite RSpec que muere al salir de la puerta de salida.
Otra opción es usar la gema Memoist:
Es una extracción directa de ActiveSupport::Memoizable
y se puede utilizar como un reemplazo directo. Solo require ''memoist''
y cambie
extend ActiveSupport::Memoizable
a
extend Memoist
Solo una adición a la respuesta superior, para memorizar un método de clase, use el siguiente patrón:
class Foo
class << self
def bar
@bar ||= begin
# ...
end
end
end
end