Ruby - расширяющий метод с использованием super splat

В электронной книге "Комплексный курс по Ruby" у меня есть случай, когда метод дочернего класса расширяет метод родителей. Я не совсем понимаю, как это работает:

class Parent
  def initialize(foo:, bar:)
   @foo = foo
   @bar = bar
  end
end

class Child < Parent
  def initialize(buzz:,**args)
   super(**args)
   @buzz = buzz
  end
end

Я не могу полностью понять, почему мы используем сплат здесь - **args, Здесь def initialize(buzz:,**args) мы просто говорим initialize принять неизвестное количество аргументов ключ-значение, верно? Но что именно это означает super(**args), Чтобы сказать методу, чтобы взять эти аргументы ключ-значение из метода суперкласса? Почему бы просто не так:

class Child < Parent
  def initialize(buzz:)
   super
   @buzz = buzz
  end
end

В конце концов, super говорит расширять метод тем, что есть в родительском элементе, так зачем нужны эти аргументы?

1 ответ

Решение

**args в списке параметров просто означает "получить все дополнительные ключевые аргументы и поместить их в хеш, называемый args "

Наоборот, **args при вызове метода поступает наоборот args и передать ключевые аргументы с соответствующими именами и значениями из этого хэша ".


super без аргументов попытается передать все аргументы, полученные дочерним методом. Следовательно, если у вас есть дополнительные, что родитель не ожидал, вы получите ArgumentError,

В вашем примере родитель ожидает только foo: а также bar: в то время как ребенок также имеет buzz:,

Другие вопросы по тегам