В электронной книге Комплексный курс программирования на 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
говорит о расширении метода тем, что есть в родительском объекте, так зачем нужны эти splat-аргументы?