ruby ruby-on-rails-3 activesupport memoization

¿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).



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