簡體   English   中英

類和實例級別的模塊方法中的代碼重復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM