gpt4 book ai didi

ruby - 这是 &&= 在 Ruby 中的合理用法吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:59:51 26 4
gpt4 key购买 nike

SO question 2068165一个答案提出了使用这样的东西的想法:

params[:task][:completed_at] &&= Time.parse(params[:task][:completed_at])

作为 DRYer 的说法

params[:task][:completed_at] = Time.parse(params[:task][:completed_at]) if params[:task][:completed_at]

params Hash 将来自 (Rails/ActionView) 表单。

这是众所周知的 ||= 习语的一种推论,如果 LHS 不是 nil/false 则设置值。

像这样使用 &&= 实际上是一个公认的 Ruby 惯用语,我不知何故错过了还是我只是忘记了一个更常用的惯用语? 已经很晚了...

最佳答案

应该是。如果不出意外,params[:task] 仅在使用 &&= 形式时计算一次。

澄清一下:

params[:task][:completed_at] = params[:task][:completed_at] && ...

params 上调用 [](:task) 两次,[](:completed_at)[]=(: completed_at) 每个在 params[:task] 上一次。

params[:task][:completed_at] &&= ...

调用 [](:task) on params 一次,它的值被隐藏起来用于 [](:completed_at)[]=(:completed_at) 调用。


描述我要说明的内容的实际示例(基于 Marc-Andre 的示例代码;非常感谢):

class X
def get
puts "get"
@hash ||= {}
end
end

irb(main):008:0> x = X.new
=> #<X:0x7f43c496b130>
irb(main):009:0> x.get
get
=> {}
irb(main):010:0> x.get[:foo] = 'foo'
get
=> "foo"
irb(main):011:0> x.get[:foo]
get
=> "foo"
irb(main):012:0> x.get[:foo] &&= 'bar'
get
=> "bar"
irb(main):013:0> x.get[:foo] = x.get[:foo] && 'bar'
get
get
=> "bar"

请注意,使用“扩展”形式会导致“get”被打印两次,但使用紧凑形式只会导致它被打印一次。

关于ruby - 这是 &&= 在 Ruby 中的合理用法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2068584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com