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:
,