试试方法和&& amp;运营商服务于同一目的?

时间:2016-02-23 05:43:58

标签: ruby-on-rails ruby

假设有一个模型user.rb。我有一个方法定义firstname

def firstname
 shipping_address.try(:firstname)
end

def firstname
  shipping_address && shipping_address.firstname
end

在这两种情况下,我们都在尝试避免不必要的异常。这是尝试用于什么?

4 个答案:

答案 0 :(得分:3)

没有

前面有一个假值时,

&&会取消后面任何表达式的进一步应用。如果未执行以下表达式,则返回值是&&之前的值,即falsenil

try 评估要使用相关方法传递的所有参数,并在时取消该方法的应用未定义。如果未执行方法调用,则返回值为nil

答案 1 :(得分:1)

是的,在这个例子中也是如此,但是因为ruby 2.3我们有一个新的运算符,称为“安全导航运算符”:

def firstname
  shipping_address&.firstname
end

答案 2 :(得分:0)

实质上,是的。

请记住,它由rails添加。所以它不适用于普通的ruby项目。

有关详细信息,请参阅Object#try

答案 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