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