我刚开始使用 Ruby,我个人认为以下内容违反了“最小意外原则”。也就是说,从文档中引用,那个 uniq! “从自身中删除重复的元素。如果没有进行任何更改(即没有找到重复项),则返回 nil。”
谁能解释一下,这对我来说似乎完全违反直觉?这意味着,而不是能够通过附加 .uniq 来编写下面的一行代码!要结束第一行,我必须编写以下两行:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks = hooks.uniq
还是我错过了什么,更好的方法?
编辑:
我明白那个独特的!修改其操作数。这是我希望更好地说明的问题:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
puts hooks.length #50
puts hooks.uniq!.length #undefined method `length' for nil:NilClass
我主张这种方式uniq!作品使它完全没有意义和无用。当然,正如我所指出的那样,我可以将 .uniq 附加到第一行。但是稍后在同一个程序中,我将元素推送到循环内的另一个数组中。然后,在循环下,我想对数组进行“重复数据删除”,但我不敢写 'hooks_tested.uniq!' 因为它可以返回 nil;相反,我必须写 hooks_tested = hooks_tested.uniq
事实上,我认为这是一个特别令人震惊的错误特征,因为这是一个众所周知的原则,即在设计返回数组的方法时,应该始终至少返回一个空数组,而不是 nil