Ruby - 使用 splat 扩展方法

Ruby - extending method with super using splat

"Comprehensive Ruby programming course" 电子书中我有一个案例,子 class 方法扩展了父方法。我不完全知道它是如何工作的:

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)。告诉方法从 superclass 方法中获取那些键值参数?为什么不这样:

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

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

参数列表中的

**args 简单表示 "get all extra keyword arguments and put them in a hash, called args".

相反,**args 在调用方法时执行相反的操作 - "get this hash called args and pass keyword arguments with the corresponding names and values from that hash".


不带参数的

super 将尝试传递 child 方法收到的所有参数。因此,如果您有 parent 没有预料到的额外信息,您将得到 ArgumentError.

在您的示例中,parent 只需要 foo:bar:,而 child 也有 buzz: