Так и должно быть. Если ничего другого, params[:task]
оценивается только один раз при использовании формы &&=
.
Для уточнения:
params[:task][:completed_at] = params[:task][:completed_at] && ...
звонит [](:task)
на params
дважды, [](:completed_at)
и []=(:completed_at)
один раз на params[:task]
.
params[:task][:completed_at] &&= ...
вызывает [](:task)
на params
один раз, и его значение скрывается для вызовов [](:completed_at)
и []=(:completed_at)
.
Фактический пример, описывающий то, что я пытаюсь проиллюстрировать (на основе примера кода Марка-Андре; большое спасибо):
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» печатается дважды, а использование компактной формы - только один раз.