Ruby on rails 试一试方法和&&;运营商是否也有同样的目的?
假设有一个模型Ruby on rails 试一试方法和&&;运营商是否也有同样的目的?,ruby-on-rails,ruby,Ruby On Rails,Ruby,假设有一个模型user.rb。我有一个定义名字的方法 def firstname shipping_address.try(:firstname) end def firstname shipping_address && shipping_address.firstname end 在这两种情况下,我们都试图避免不必要的异常。这就是try的用途吗?本质上是的 请记住,它是由rails添加的。因此,它在普通的ruby项目中不起作用 有关更多信息,请参阅。是的,在本例中也
user.rb
。我有一个定义名字的方法
def firstname
shipping_address.try(:firstname)
end
def firstname
shipping_address && shipping_address.firstname
end
在这两种情况下,我们都试图避免不必要的异常。这就是try的用途吗?本质上是的
请记住,它是由rails
添加的。因此,它在普通的ruby
项目中不起作用
有关更多信息,请参阅。是的,在本例中也是如此,但是由于ruby 2.3,我们有了一个新的操作符,称为“安全导航操作符”: 没有
和&
取消进一步应用任何表达式,如果该表达式前面有一个伪值。当不执行以下表达式时,返回值是&&
之前的值,即false
或nil
try
计算所有参数,这些参数将与所讨论的方法一起传递,并在未定义时取消该方法的应用。当不执行方法调用时,返回值为nil
,正如@dharam已经说过的,#try
方法是Rails方法,&
是纯ruby方法。它的基本原理非常简单。但是不,它们是不同的,因为@sawa已经说过-&
如果表达式是nil
或false
,则操作将取消
这里的源代码(#try
,不使用bang,使用此方法):
我认为本质是一样的。我知道&执行短路,但是像“shipping\u address&&shipping\u address.try(:firstname)”这样的语句没有意义。干杯
def firstname
shipping_address&.firstname
end
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