我能找到的关于 Ruby 的新安全导航运算符 ( ) 的每个问题的答案(Q1、Q2&.
)都错误地声明它obj&.foo
等同于obj && obj.foo
.
很容易证明这种等价是不正确的:
obj = false
obj && obj.foo # => false
obj&.foo # => NoMethodError: undefined method `foo' for false:FalseClass
此外,存在多重评估的问题。用具有副作用的表达式替换obj
表明副作用仅在&&
表达式中加倍:
def inc() @x += 1 end
@x = 0
inc && inc.itself # => 2
@x = 0
inc&.itself # => 1
obj&.foo
避免这些问题的最简洁的 pre-2.3 等价物是什么?