Ruby - 使用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?

参数

列表中的**args只是意味着"获取所有额外的关键字参数并将它们放入称为args的哈希中"。

相反,**args调用方法时会做相反的事情 - "获取这个称为args的哈希,并从该哈希中传递具有相应名称和值的关键字参数"。


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

在您的示例中,父母只期望foo:bar:,而孩子也有buzz:

相关内容

  • 没有找到相关文章

最新更新