什么& (&符号点)在Ruby意味着什么?

我遇到了这一行的ruby代码。 什么&. 这意味着什么?

 @object&.method 

它被称为安全导航运营商。 在Ruby 2.3.0中引入,它可以让你调用对象的方法,而不用担心对象可能是nil (避免一个undefined method for nil:NilClass错误),类似于Rails中的try方法 。

所以你可以写

 @person&.spouse&.name 

代替

 @person.spouse.name if @person && @person.spouse 

注意:尽pipe@Santosh给出了一个清晰而完整的答案,我想添加一些更多的背景信息,并添加一个关于非实例variables使用的重要说明


它被称为“ 安全导航运营商 ”( 又名“可选链接运营商”,“空条件运营商”等 )。 马茨似乎把它称为“孤独的经营者”。 它是在Ruby 2.3中引入的 。 只有当它不是nil它才会将一个方法发送给一个对象。

例:

 # Call method `.profile` on `user` only if `user` is not `nil` @user&.profile # Equivalent to unless @user.nil? @user.profile end 

带局部variables的“边缘情况”:

请注意,上面的代码使用实例variables。 如果你想使用带有局部variables的安全导航操作符,你将不得不检查你的局部variables是否是首先定义的。

 # `user` local variable is not defined previous user&.profile # This code would throw the following error: NameError: undefined local variable or method `user' for main:Object 

要解决这个问题,请检查您的本地variables是先定义还是设置为零:

 # Option 1: Check the variable is defined if defined?(user) user&.profile end # Option 2: Define your local variable. Example, set it to nil user = nil user&.profile # Works and does not throw any errors 

方法背景

Rails的try方法基本上是一样的。 它在内部使用send方法来调用一个方法。 马茨build议 ,它是缓慢的,这应该是一个内置的语言function。

许多其他的编程语言也有类似的function:Objective C,Swift,Python,Scala,CoffeeScript等。但是,常见的语法是?. (问题点)。 但是,这个语法不能被Ruby所采用。 因为? 被方法名称所允许,因此?. 符号序列已经是一个有效的Ruby代码。 例如:

 2.even?.class # => TrueClass 

这就是为什么Ruby社区不得不提出不同的语法。 这是一个积极的讨论,并考虑了不同的select( .??&&等)。 以下是一些注意事项的列表:

 u.?profile.?thumbnails u\profile\thumbnails u!profile!thumbnails u ? .profile ? .thumbnails u && .profile && .thumbnails # And finally u&.profile&.thumbnails 

在select语法的同时,开发人员查看了不同的边界情况,并且讨论对于通过是非常有用的。 如果您想要了解运营商的所有变体和细微差别,请参阅关于官方Ruby问题跟踪器的function介绍讨论 。