我偶然发现了这行ruby代码。什么&。这是什么意思?
@object&.method
我偶然发现了这行ruby代码。什么&。这是什么意思?
@object&.method
当前回答
它被称为安全导航操作员。在Ruby 2.3.0中引入,它让你可以在对象上调用方法,而不用担心对象可能是nil(避免nil的未定义方法:NilClass错误),类似于Rails中的try方法。
所以你可以写
@person&.spouse&.name
而不是
@person.spouse.name if @person && @person.spouse
来自文档:
my_object.my_method 这将my_method消息发送给my_object。任何 对象可以是接收器,但这取决于方法的可见性 发送消息可能会引发NoMethodError。 你可以使用&。要指定一个接收者,则不调用my_method 当接收器为nil时,结果为nil。在这种情况下, my_method的参数不计算。
其他回答
它用于nil检查,如在kotlin和swift中 例如; 与对象-> Swift和Kotlin
model = car?.model
如果我们没有在car类中定义模型值,这个模型可以是nil(Swift)或null(Kotlin)。 在ruby中,我们使用&号而不是问号
model = car&.model
如果使用汽车。模型没有&号,如果模型为空,系统不能继续运行。
这是我在这上面找到的一篇短文(3分钟)——非常不错。
为了补充上面的内容,它的作用类似于try!方法,而不是try方法。
因为它会引发一个NoMethodError异常如果接收者不是nil并且没有实现尝试的方法。
摘自上述文章的例子:
account = Account.new(owner: Object.new)
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account.try!(:owner).try!(:address)
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
对于所有学过Typescript的人来说,它和?操作符
object&。An_attribute在ruby on rails?
我是Ruby on rails的新手,我看到了这种代码,但我不理解它:
在Ruby中,像大多数主流编程语言一样,用户代码不能修改编程语言的基本工作方式,也不能改变编程语言的语法。
因为Ruby on Rails只是Ruby代码,所以很明显这与Ruby on Rails没有任何关系。
因此,我们需要从Ruby中寻找解释,而不是Ruby on Rails。
安全导航操作符或安全导航器在language/safe_navigator_spec中指定。ruby/spec的Rb,特别是这里:
Context“当Context为nil时”做 它“总是返回nil” eval(“nil&.unknown”)。应该== nil eval(“[][10]&.unknown”)。应该== nil 结束 它“可以被拴住” eval(“nil&.one&.two&.three”)。应该== nil 结束 它“不评估论点” obj = Object.new obj.should_not_receive(米): Eval ("nil&.unknown(obj.m) {obj. xml ")m}”) 结束 结束
它被记录在Ruby语法文档的调用方法部分:
&。,称为“安全导航操作符”,允许在接收器为nil时跳过方法调用。如果跳过调用,它将返回nil并且不计算方法的参数。
小心!虽然安全导航操作符很方便,但也很容易欺骗自己用它改变逻辑。我建议避免在流量控制中使用它。例子:
str = nil
puts "Hello" if str.nil? || str.empty?
# The above line is different than the below line
puts "Hello" if str&.empty?
在第一个例子中,str.nil?返回true和str.empty?从未调用,导致执行puts语句。然而,在第二个例子中,str&.empty?返回nil,这是假的,并且puts语句永远不会执行。