【问题标题】:Ruby - extending method with super using splatRuby - 使用 splat 的超级扩展方法
【发布时间】:2017-08-25 22:00:00
【问题描述】:

《综合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?

【问题讨论】:

  • 尝试您的解决方案了吗?你会得到一个错误,应该告诉你为什么需要 splat args。

标签: ruby super splat


【解决方案1】:

参数列表中的**args 仅表示“获取所有额外的关键字参数并将它们放入一个散列中,称为args

相反,**args 在调用方法时会做相反的事情 - “获取这个名为 args 的散列并从该散列传递具有相应名称和值的关键字参数”


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

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

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2017-08-06
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2013-09-10
    相关资源
    最近更新 更多