什么& (&符号点)在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介绍讨论 。