【发布时间】:2010-01-20 14:59:41
【问题描述】:
我刚开始使用 Ruby,我个人认为以下内容违反了“最小意外原则”。也就是说,引用the documentation,那个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
【问题讨论】:
-
POLS 对 Ruby 有特定的含义:“Matz(Ruby 的创造者)并不意外。
-
对您试图提出的(不正确的)目的无用,同意。如果您尝试做一些事情——例如——测试
uniq!的结果,这会很方便。这可能就是马茨的想法。 ;-) -
我同意。这是非常 PHP 式的(随机的、不协调的例外情况)。所有其他情况,包括
uniq返回原始情况。当uniq没有找到重复项时,它会返回数组本身。严重的wtf。 -
@MikeWoodhouse 用于该目的的方法应该是
uniq?而不是uniq!