在问题2068165中,一个答案提出了使用这样的东西的想法:
params[:task][:completed_at] &&= Time.parse(params[:task][:completed_at])
Run Code Online (Sandbox Code Playgroud)
作为一种干燥的说法
params[:task][:completed_at] = Time.parse(params[:task][:completed_at]) if params[:task][:completed_at]
Run Code Online (Sandbox Code Playgroud)
params Hash将来自(Rails/ActionView)表单.
这是众所周知的||=成语的必然结果,如果LHS 不是零/假则设定值.
使用&&=这样的实际上是一个公认的Ruby成语,我不知何故错过了或者我只是忘记了一个更常用的成语?这是越来越起步比较晚...
它应该是.如果没有别的,params[:task]只使用&&=表格评估一次.
澄清:
params[:task][:completed_at] = params[:task][:completed_at] && ...
Run Code Online (Sandbox Code Playgroud)
呼吁[](:task)在params两次,[](:completed_at)并[]=(:completed_at)一度上每个params[:task].
params[:task][:completed_at] &&= ...
Run Code Online (Sandbox Code Playgroud)
要求[](:task)对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"
Run Code Online (Sandbox Code Playgroud)
请注意,使用"展开"形式会导致"get"打印两次,但使用紧凑形式会导致仅打印一次.