【发布时间】:2016-10-26 22:46:57
【问题描述】:
有没有更短的方法来做到这一点(考虑到a 已经设置为某个值):
a = b if b.present?
我以前可能遇到过这样做的方法,但不记得了。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4.2 ruby-2.0
有没有更短的方法来做到这一点(考虑到a 已经设置为某个值):
a = b if b.present?
我以前可能遇到过这样做的方法,但不记得了。
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-4.2 ruby-2.0
仅a = b if b.present? 本身在功能上等同于:
if b.present?
a = b
else
a = nil
end
所以你可以使用Object#presence:
存在()
如果接收者存在则返回接收者,否则返回nil。object.presence相当于object.present? ? object : nil
像这样:
a = b.presence
如果a 已经有一个值并且你真的在说:
a = something_interesting
a = b if b.present?
那么你可以说:
a = b.presence || something_interesting
【讨论】:
如果 b 是一些您只想计算一次的复杂表达式,您可以使用
a = b.presence || a
【讨论】:
你可以这样做
a = b if !b.nil?
或
a = b if b
或
a = b if b != nil
present? 的作用在于它可以保护您免受空数组、散列和其他集合的陷阱。因此,如果您不担心空集合,这些将起作用。
【讨论】:
a ||= b 更类似于a = b unless a 而不是a = b if b,这是一个非常不同的含义。
您可以使用||= 运算符,但这取决于您希望代码执行的操作。如果b不是nil,则此运算符将b的值分配给a。例如,如果a = 5并执行以下操作a ||= b将b的值分配给a 仅当b 不是nil,但如果a 之前未声明a 的值将是nil 对于此代码a ||= b。
示例:
irb(main):001:0> b = nil
=> nil
irb(main):002:0> a ||= b
=> nil
irb(main):003:0> b = 5
=> 5
irb(main):004:0> a ||= b
=> 5
irb(main):005:0> a ||= nil
=> 5
【讨论】:
||= 运算符是您正在寻找的。它在赋值之前检查操作数是否为 nil 或存在。如果 present 不赋值,如果 nil 或 undefined 将赋值。
[1] pry(main)> a
NameError: undefined local variable or method `a' for main:Object
from (pry):1:in `__pry__'
[2] pry(main)> a ||= 100
=> 100
[3] pry(main)> a = nil
=> nil
[4] pry(main)> a ||= 100
=> 100
[5] pry(main)> a ||= 200
=> 100
【讨论】: