在"综合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
我不完全明白为什么我们在这里使用 splat - **args
.在这里def initialize(buzz:,**args)
我们只是告诉initialize
接受未知数量的键值参数,对吧?但这究竟意味着什么super(**args)
.告诉方法从超类方法中获取这些键值参数?为什么不这样:
class Child < Parent
def initialize(buzz:)
super
@buzz = buzz
end
end
毕竟,super
告诉使用父级中的任何内容来扩展方法,那么为什么需要这些 splat args?
列表中的**args
只是意味着"获取所有额外的关键字参数并将它们放入称为args
的哈希中"。
相反,**args
调用方法时会做相反的事情 - "获取这个称为args
的哈希,并从该哈希中传递具有相应名称和值的关键字参数"。
没有参数super
将尝试传递子方法收到的所有参数。因此,如果您有父母没有预料到的额外内容,您将获得ArgumentError
。
在您的示例中,父母只期望foo:
和bar:
,而孩子也有buzz:
。