在评论
航行安全操作(&与@Redithion同意。)在Ruby中
方案
假设你有一个具有owner
的account
,并且希望得到业主的address
。如果你想成为安全,而不是风险无差错,你会写像下面这样:
if account && account.owner && account.owner.address
...
end
这是非常啰嗦和恼人的输入。的ActiveSupport包括具有类似的行为(但稍后将讨论一些关键的差异)的try
方法:
if account.try(:owner).try(:address)
...
end
它完成同样的事情 - 如果沿着链一定的价值是它要么返回地址或nil
nil
。例如,如果owner
设置为false,则第一个示例也可能返回false。
使用&。
我们可以使用安全导航操作重写前面的例子:
account&.owner&.address
更多的例子
我们来比较一下更详细的三种方法。
account = Account.new(owner: nil) # account without an owner
account.owner.address
# => NoMethodError: undefined method `address' for nil:NilClass
account && account.owner && account.owner.address
# => nil
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => nil
到目前为止没有意外。如果owner
是false
(在令人兴奋的低劣代码世界中不太可能,但不是不可能)?
account = Account.new(owner: false)
account.owner.address
# => NoMethodError: undefined method `address' for false:FalseClass `
account && account.owner && account.owner.address
# => false
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => undefined method `address' for false:FalseClass`
这里谈到的第一个惊喜 - &.
语法只跳过nil
但承认假的!它不完全等同于s1 && s1.s2 && s1.s2.s3
语法。
如果店主在场,但不回应address
?
account = Account.new(owner: Object.new)
account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>
account && account.owner && account.owner.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
account.try(:owner).try(:address)
# => nil
account&.owner&.address
# => NoMethodError: undefined method `address' for #<Object:0x00559996b5bde8>`
下面的例子是混乱和nil&.nil?
应该返回true
。
使用&.
操作符并检查nil
值时要小心。请看下面的例子:
nil.nil?
# => true
nil?.nil?
# => false
nil&.nil?
# => nil
参考:here
他们是不一样的,你可以阅读更多关于区别[这里](http://mitrev.net/ruby/2015/11/13 /所述运营商合红宝石/) – Redithion