ruby-on-rails Ruby的安全导航操作符(&.)在产品代码中使用多年后不再按预期工作

oaxa6hgo  于 2023-01-06  发布在  Ruby
关注(0)|答案(1)|浏览(182)

我在产品代码中遇到了这个问题,这些代码已经运行了很多年,没有任何问题,突然之间,我使用&.操作符的很多地方都崩溃了。所以我想知道这是否不仅仅是一个环境变量或某种解释器选项。它是在Rails 5.1.4上运行Ruby 2.5.9
以下面一行为例

s.item.tags.select { |tag| tag.name }

itemnil,因此尝试执行此行将产生以下错误

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有关,可能不是因为环境变量或解释器选项。

kognpnkq

kognpnkq1#

一定是您这边的数据问题--一些新的s记录不包含items-〉tags中的任何关系,而不是Ruby的安全导航行为在同一版本中自己改变(假设没有发生Ruby版本升级)。
Ruby中的安全导航就是这样的,甚至在Ruby的官方文档中也有这样的行为:
注意&.只跳过一个下一个调用,因此对于较长的链,有必要在每个级别上添加运算符

相关问题