¿A qué patrón de Ruby memoize se refiere ActiveSupport::Memoizable?


Así que en Rails 3.2, ActiveSupport::Memoizable ha sido obsoleto.

El mensaje dice:

DEPRECATION WARNING: ActiveSupport::Memoizable is deprecated and
will be removed in future releases,simply use Ruby memoization
pattern instead.

Se refiere a "Ruby memoization pattern" (singular) como si hubiera un patrón al que todos deberíamos referirnos...

Supongo que significan algo 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?

Author: jwfearn, 2012-02-03

4 answers

Aquí está el commit (y la discusión subsiguiente) donde Memoizable fue obsoleto: https://github.com/rails/rails/commit/36253916b0b788d6ded56669d37c96ed05c92c5c

El autor aboga por el enfoque @foo ||= ... y señala este commit como un ejemplo para la migración: https://github.com/rails/rails/commit/f2c0fb32c0dce7f8da0ce446e2d2f0cba5fd44b3 .

Editar: Tenga en cuenta que no necesariamente interpreto este cambio en el sentido de que todas las instancias de memoize pueden o debe ser reemplazado w / este patrón. Lo leí como significando que Memoizable ya no es necesario/deseado en el propio código Rails. Como señalan los comentarios, Memoizable es mucho más que un envoltorio alrededor de @foo ||= .... Si necesitas esas características, sigue adelante y usa Memoizable, solo tendrás que obtenerlas de otro lugar que no sea ActiveSupport (supongo que alguien bifurcará una versión de gema, si aún no lo han hecho).

 37
Author: avaynshtok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-02-06 06:40:28

Otra opción es usar la gema Memoista:

Es una extracción directa de ActiveSupport::Memoizable y se puede usar como reemplazo directo. Solo require 'memoist' y cambiar

extend ActiveSupport::Memoizable

A

extend Memoist
 32
Author: jcfischer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-10 03:39:45

Solo una adición a la respuesta superior, para recordar un método de clase use el siguiente patrón:

class Foo
  class << self
    def bar
      @bar ||= begin
        # ...
      end
    end
  end
end
 3
Author: dsager,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-03 16:52:28

Basado en los comentarios sobre el commit mencionado anteriormente por avaynshtok, voy con esto:

ActiveSupport::Deprecation.silence { extend ActiveSupport::Memoizable }

Because porque me imagino que sabré cuando Memoizable es arrancado de ActiveSupport de mi suite RSpec muriendo justo fuera de la puerta de salida.

 0
Author: aec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:08:58