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

SO question 2068165,一个答案提出了使用这样的东西的想法:
params[:task][:completed_at] &&= Time.parse(params[:task][:completed_at])

作为一种干燥的说法

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]上对params两次调用[](:task),[](:completed_at)和[] =(:completed_at).

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

在params上调用[](:task)一次,并且它的值被隐藏在[](: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”打印两次,但使用紧凑形式会导致仅打印一次.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...