Ruby - 使用splat的超级扩展方法

时间:2017-03-31 15:04:13

标签: 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

我无法完全理解为什么我们在这里使用splat - **args。 在这里def initialize(buzz:,**args)我们只是告诉initialize采用未知数量的键值参数,对吧?但究竟这意味着什么super(**args)。告诉方法从超类方法中获取那些键值参数?为什么不这样:

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

毕竟,super告诉我们使用父级中的任何内容来扩展方法,那么为什么需要这些splat args呢?

1 个答案:

答案 0 :(得分:2)

参数列表中的

**args仅表示“获取所有额外的关键字参数并将其放入哈希,称为args

相反,调用方法时**args执行相反的操作 - “将此哈希称为args,并使用该哈希”中相应的名称和值传递关键字参数。

没有参数的

super将尝试传递子方法收到的所有参数。因此,如果你有额外的父母没想到的,你将获得ArgumentError

在您的示例中,父级只需要foo:bar:,而孩子也只有buzz: