我在产品代码中遇到了这个问题,这些代码已经运行了很多年,没有任何问题,突然之间,我使用&.
操作符的很多地方都崩溃了。所以我想知道这是否不仅仅是一个环境变量或某种解释器选项。它是在Rails 5.1.4
上运行Ruby 2.5.9
以下面一行为例
s.item.tags.select { |tag| tag.name }
item
是nil
,因此尝试执行此行将产生以下错误
undefined method `tags' for nil:NilClass
所以理论上通过使用&.
算子
s.item&.tags.select { |tag| tag.name }
我不应该得到这个错误,但我
private method `select' called for nil:NilClass
在我看来,它应该在s.item&.
处停止并返回nil
,但它仍在继续。
如果我再添加一个&.
,它将在下一个上崩溃
s.item&.tags&.select { |tag| tag.name }.map { ... }
undefined method `map' for nil:NilClass
等等。
--编辑--
我应该提一下,我假设发生的是,过去从未发生过s.item
为nil的情况,因此它从未因此崩溃。似乎大多数错误都与该特定项为nil有关,可能不是因为环境变量或解释器选项。
1条答案
按热度按时间kognpnkq1#
一定是您这边的数据问题--一些新的
s
记录不包含items
-〉tags
中的任何关系,而不是Ruby的安全导航行为在同一版本中自己改变(假设没有发生Ruby版本升级)。Ruby中的安全导航就是这样的,甚至在Ruby的官方文档中也有这样的行为:
注意&.只跳过一个下一个调用,因此对于较长的链,有必要在每个级别上添加运算符