假设有一个模型user.rb
。我有一个方法定义firstname
。
def firstname
shipping_address.try(:firstname)
end
def firstname
shipping_address && shipping_address.firstname
end
在这两种情况下,我们都在尝试避免不必要的异常。这是尝试用于什么?
答案 0 :(得分:3)
没有
当前面有一个假值时, &&
会取消后面任何表达式的进一步应用。如果未执行以下表达式,则返回值是&&
之前的值,即false
或nil
。
try
评估要使用相关方法传递的所有参数,并在时取消该方法的应用未定义。如果未执行方法调用,则返回值为nil
。
答案 1 :(得分:1)
是的,在这个例子中也是如此,但是因为ruby 2.3我们有一个新的运算符,称为“安全导航运算符”:
def firstname
shipping_address&.firstname
end
答案 2 :(得分:0)
答案 3 :(得分:0)
正如@dharam已经说过的那样,#try
方法是一个Rails方法,&&
是纯粹的红宝石。它的source code非常简单。但是没有它们不同,因为@sawa已经说过 - &&
如果表达式为nil
false
,则操作会取消。
此处源代码(#try
,没有爆炸,使用此方法):
def try!(*a, &b)
if a.empty? && block_given?
if b.arity == 0
instance_eval(&b)
else
yield self
end
else
public_send(*a, &b)
end
end