Ruby 3.2 - 单个参数的关键字参数问题

Ruby 3.2 - Keyword Arguments Issue with a single argument

提问人:Derek 提问时间:11/17/2023 最后编辑:Artur INTECHDerek 更新时间:11/17/2023 访问量:81

问:

我正在浏览旧的代码库,可以看到带有单个关键字参数的方法签名示例。

这是你通常会在 Ruby 中做的事情吗?这似乎有点奇怪。我希望在您可以拥有一个或多个参数的地方看到它。

我注意到在 Ruby 3.2 升级中,在运行测试套件时,此语法会丢失。

这是 Ruby 3.2 中删除的东西吗,我查看了文档,但无法确定问题所在。

def greet(name: "Guest")
  puts "Hello, #{name}!"
end

greet(name: "Alice")  # Output: Hello, Alice!
红宝石

评论


答:

1赞 Artur INTECH 11/17/2023 #1

关键字参数的存在是为了消除所谓的位置一致性,这意味着您需要记住参数的顺序。如果更改顺序,还必须更新所有呼叫位置。

关键字参数是否适用由设计人员决定。我认为你的例子没有错,但可能会坚持常规的定位参数,因为只有一个参数,而且猜测你需要传递什么并不是特别难(至少对我来说)。

P.S. 关键字参数功能不会从 Ruby 中删除,而且不太可能删除。不确定你指的是什么文档。

评论

0赞 Derek 11/17/2023
kwargs 在 ruby 3.2 中更新,我做了许多更改以使用双 splats 等传递它们,但是在这一个情况下,只需要一个 kwarg,我问这不是毫无意义吗?
5赞 Stefan 11/17/2023 #2

[...]具有单个关键字参数的方法签名。

这是你通常会在 Ruby 中做的事情吗?

这取决于用例。即使使用单个参数,关键字参数也有助于更明确地传达参数的意图,例如 或。obj.clone(freeze: false)Time.now(in: '+0200')

如果没有名称,参数的作用就不清楚了:obj.clone(false)

在您的例子中,它可能是传递名称的提示,而不是(例如)富用户对象或问候消息。或者,也许作者只是希望代码更明确。


我注意到在 Ruby 3.2 升级中,在运行测试套件时,此语法会丢失。

这是 Ruby 3.2 中移除的东西吗?

你展示的这个例子在 Ruby 3.2 中是完全有效的,不会导致任何错误。Ruby 3.x 的一个主要变化是删除了隐式哈希到关键字参数的转换:

hash = { name: "Alice" }

greet(hash)
# Ruby 2.6: works
# Ruby 2.7: works but prints deprecation warning (when enabled)
# Ruby 3.x: raises ArgumentError

如果你的旧代码库中有类似上述的东西,你现在必须添加以显式地将哈希转换为关键字参数:**

greet(**hash)