【问题标题】:splat operator on hash for keyword arguments in ruby method definitionruby 方法定义中关键字参数的散列上的 splat 运算符
【发布时间】:2023-04-08 07:17:01
【问题描述】:

我有这样的课:

class AwesomeService
  attr_reader :a, :b

  def initialize(a: 30, b: 40)
    @a = a
    @b = b
  end
end

我正在尝试做这样的事情:

class AwesomeService
  DEFAULTS = {
    a: 30,
    b: 40
  }

  attr_reader *DEFAULTS.keys

  def initialize(**DEFAULTS)
    @a = a
    @b = b
  end
end

这样我就可以将默认值保存在单独的哈希中。

但我得到了错误:

SyntaxError ((irb): syntax error, unexpected tCONSTANT, expecting ')')
  def initialize(**DEFAULTS)
                   ^~~~~~~~

似乎初始化中的 splat 运算符没有像我预期的那样工作。但这似乎是这样做的合乎逻辑的方式。我在这里做错了什么?

【问题讨论】:

    标签: ruby ruby-2.5


    【解决方案1】:

    是的……这不是你能做的。

    **foo 在参数列表中是您收集 kwargs 哈希的方式,因此它也不能是您注入的方式。

    更重要的是,kwargs 的要点是它们将散列分解为局部变量——如果它在运行时扩展散列,这将无法工作。

    你能得到的最接近的应该是这样的:

    def initialize(**values)
      values = DEFAULTS.merge(values)
      raise "..." unless (values.keys - DEFAULTS.keys).empty?
      @a = values[:a]
      @b = values[:b]
    end
    

    【讨论】:

    • 嗯,有道理。
    • 我省略了代码的 raise 部分,因为我不介意有人将不存在的键传递给该方法。
    猜你喜欢
    • 2017-08-08
    • 2013-07-04
    • 2012-09-22
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2013-11-13
    相关资源
    最近更新 更多