在“综合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呢?
答案 0 :(得分:2)
**args
仅表示“获取所有额外的关键字参数并将其放入哈希,称为args
”。
相反,调用方法时**args
执行相反的操作 - “将此哈希称为args
,并使用该哈希”中相应的名称和值传递关键字参数。
super
将尝试传递子方法收到的所有参数。因此,如果你有额外的父母没想到的,你将获得ArgumentError
。
在您的示例中,父级只需要foo:
和bar:
,而孩子也只有buzz:
。