提问人:Derek 提问时间:11/17/2023 最后编辑:Artur INTECHDerek 更新时间:11/17/2023 访问量:81
Ruby 3.2 - 单个参数的关键字参数问题
Ruby 3.2 - Keyword Arguments Issue with a single argument
问:
我正在浏览旧的代码库,可以看到带有单个关键字参数的方法签名示例。
这是你通常会在 Ruby 中做的事情吗?这似乎有点奇怪。我希望在您可以拥有一个或多个参数的地方看到它。
我注意到在 Ruby 3.2 升级中,在运行测试套件时,此语法会丢失。
这是 Ruby 3.2 中删除的东西吗,我查看了文档,但无法确定问题所在。
def greet(name: "Guest")
puts "Hello, #{name}!"
end
greet(name: "Alice") # Output: Hello, Alice!
答:
关键字参数的存在是为了消除所谓的位置一致性,这意味着您需要记住参数的顺序。如果更改顺序,还必须更新所有呼叫位置。
关键字参数是否适用由设计人员决定。我认为你的例子没有错,但可能会坚持常规的定位参数,因为只有一个参数,而且猜测你需要传递什么并不是特别难(至少对我来说)。
P.S. 关键字参数功能不会从 Ruby 中删除,而且不太可能删除。不确定你指的是什么文档。
评论
[...]具有单个关键字参数的方法签名。
这是你通常会在 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)
评论