[英]Code duplication in a module methods of class and instance levels
我有Memoize模塊,該模塊提供用於緩存類和實例方法的方法。
module Memoize
def instance_memoize(*methods)
memoizer = Module.new do
methods.each do |method|
define_method method do
@_memoized_results ||= {}
if @_memoized_results.include? method
@_memoized_results[method]
else
@_memoized_results[method] = super()
end
end
end
end
prepend memoizer
end
def class_memoize(*methods)
methods.each do |method|
define_singleton_method method do
@_memoized_results ||= {}
if @_memoized_results.include? method
@_memoized_results[method]
else
@_memoized_results[method] = super()
end
end
end
end
end
這是我如何使用它的一個示例:
class Foo
extend Memoize
instance_memoize :instance_method1, :instance_method2
class_memoize :class_method1, :class_method2
...
end
請在此模塊中建議如何避免代碼重復。
可能會定義一個lambda :
λ = lambda do
@_memoized_results ||= {}
if @_memoized_results.include? method
@_memoized_results[method]
else
@_memoized_results[method] = super()
end
end
和。 然后:
define_method method, &λ
請注意λ
前面的與號,它用於注意define_method
正在接收一個塊,而不是常規參數。
我沒有遇到這種方法失敗的地方,但是這里是防彈的版本:
method_declaration = %Q{
def %{method}
@_memoized_results ||= {}
if @_memoized_results.include? :%{method}
@_memoized_results[:%{method}]
else
@_memoized_results[:%{method}] = super()
end
end
}
methods.each do |method|
class_eval method_declaration % {method: method}
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.