Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 试一试方法和&&;运营商是否也有同样的目的?_Ruby On Rails_Ruby - Fatal编程技术网

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