在
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则设置值.
解决方法
它应该是.如果没有别的,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”打印两次,但使用紧凑形式会导致仅打印一次.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。