Почему я не могу назвать super в define_method с методом перегрузки? - программирование

Почему я не могу назвать super в define_method с методом перегрузки?

Когда я запускаю код ниже, он вызывает ошибку:

неявный перенос аргумента super из метода, определенного define_method(), не поддерживается. Укажите все аргументы явно. (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)
4b9b3361

Ответ 1

Сообщение об ошибке довольно наглядное. Вам нужно явно передать аргументы в super, когда вы вызываете его внутри блока define_method:

mem[args] = super(*args)