【问题标题】:Safe navigation operator (&.) for nilnil 的安全导航运算符 (&.)
【发布时间】:2016-04-07 14:16:05
【问题描述】:

由于 Ruby 2.3 引入了安全导航运算符 (&.),也就是孤独的运算符,nil 对象上的行为似乎很奇怪。

nil.nil?    # => true
nil&.nil?   # => nil

是这样设计的吗?还是在添加孤独的运算符时溜走的一些边缘情况?

【问题讨论】:

  • 不清楚为什么你觉得奇怪。
  • 为什么这比在 Rails 中使用 try 更好?
  • @Jwan622 我认为这是受到try 的启发。
  • @sawa 这很奇怪,因为在显然是 nil 的东西上请求 nil?(就像 nil&. 的结果)在逻辑上应该返回 true,就像 nil.nil? 一样
  • @sawa 问题是你实际上并没有在nil&.结果 上调用nil?,但它只是初始表达式nil && nil.nil? 的一部分,在此评估中被忽略,因为该表达式的第一部分是 nil 并因此返回。请参阅 Oeste 的答案。

标签: ruby ruby-2.3 safe-navigation-operator


【解决方案1】:

foo&.barfoo && foo.bar 的简写,那么您希望表达式nil && nil.nil? 的结果是什么?

【讨论】:

  • 其实不完全是foo && foo.bar。而是(foo == nil) ? nil : foo.bar,即它只检查方法接收器是nil。当foofalse 时,这是相关的。
【解决方案2】:

这是因为nil&.nil?nil && nil.nil? 的简写。这将评估为nil && true,然后是nil

对于x 的任何值,(nil && x).nil? 的计算结果始终为true

虽然语法很强大,但这种特殊情况有可能成为开发人员的“陷阱”:

(stuff&.things).nil? => 如果东西不存在,这将产生true,或者stuff.things 返回nil

对比以下情况:

stuff&.things&.nil? => 这在所有情况下都会产生nil,除了stuff.things 返回的不是nil 的情况,在这种情况下它将返回false

由于在普通布尔逻辑中难以区分 falsenil,这在普通逻辑中不太可能有意义。

【讨论】:

  • nil && nil.nil? 直接计算为nilnil.nil? 无关紧要。试试nil && (puts 1),没有打印出来。
  • @sbs 正确。这就是short-circuit evaluation
  • 为避免陷阱,请避免使用&.nil?,因为您始终可以“安全”地致电#nil?。请改用stuff&.things.nil?
  • 有人想知道如果在表达式中评估 nil 是否会返回 false 而不是 nil 那么它会解决这个问题......
猜你喜欢
  • 2012-03-13
  • 2016-04-08
  • 2017-05-27
  • 2017-12-22
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
相关资源
最近更新 更多