为什么我不能使用重载方法在define_method中调用super?

时间:2013-11-27 09:36:36

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 ruby-on-rails-3.1

当我在下面运行代码时会出现错误:

  

不支持从define_method()定义的方法传递super的隐式参数。明确指定所有参数。 (RuntimeError)。

我不确定是什么问题。

class Result
  def total(*scores)
    percentage_calculation(*scores)
  end

  private
  def percentage_calculation(*scores)
    puts "Calculation for #{scores.inspect}"
    scores.inject {|sum, n| sum + n } * (100.0/80.0)
  end
end

def mem_result(obj, method)
  anon = class << obj; self; end
  anon.class_eval do
    mem ||= {}
    define_method(method) do |*args|
      if mem.has_key?(args)
        mem[args]
      else
        mem[args] = super
      end
    end
  end
end

r = Result.new
mem_result(r, :total)

puts r.total(5,10,10,10,10,10,10,10)
puts r.total(5,10,10,10,10,10,10,10)
puts r.total(10,10,10,10,10,10,10,10)
puts r.total(10,10,10,10,10,10,10,10)

1 个答案:

答案 0 :(得分:14)

错误消息非常具有描述性。当你在super块中调用它时,你需要明确地将参数传递给define_method

mem[args] = super(*args)