这对于Ruby中的&& =是否合理?

Mik*_*use 7 ruby operators

问题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成语,我不知何故错过了或者我只是忘记了一个更常用的成语?这越来越起步比较晚...

Chr*_*ung 5

它应该是.如果没有别的,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"打印两次,但使用紧凑形式会导致仅打印一次.