安全导航操作员(&.)为零

sbs*_*sbs 24 ruby safe-navigation-operator ruby-2.3

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

nil.nil?    # => true
nil&.nil?   # => nil
Run Code Online (Sandbox Code Playgroud)

这样设计的行为是这样吗?或者在添加孤独运算符时滑落的边缘情况?

mwp*_*mwp 33

foo&.bar是简写foo && foo.bar,所以你期望表达式的结果nil && nil.nil?是什么?

  • 实际上,它并不完全是`foo && foo.bar`.它确实是`(foo == nil)?nil:foo.bar`,即它只检查方法接收器是否为"nil".当`foo`为'false`时,这是相关的. (24认同)

Oes*_*ste 7

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

(nil && x).nil?true对于任何值,总是评估x.

虽然语法有力量,但这个特定情况有可能成为开发人员的"陷阱":

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

与下面的案例:

stuff&.things&.nil?=> nil除了stuff.things返回除了之外的其他情况之外,在每种情况下都会产生这种情况nil,在这种情况下它会返回false.

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

  • 为了避免陷阱,避免使用`&.nil?`,因为你总是"安全"地调用`#nil?`.做`stuff&.things.nil?`而不是. (3认同)