我只是从
Ruby开始,我个人发现以下是违反“最不惊奇的原则”.那就是从
the documentation引用,那个uniq! “从self中删除重复的元素,如果没有进行任何更改,那么返回nil(即没有重复的).
有人可以解释一下,这对我来说似乎完全不直观吗?这意味着,而不是通过追加.uniq来编写下面的一行代码!要结束第一行,我需要写下面两行:
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/) hooks = hooks.uniq
还是我错过了一些更好的方法?
编辑:
我明白了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!因为它可以返回零而是我必须写hooks_tested = hooks_tested.uniq
实际上,我认为这是一个特别令人震惊的错误特征,因为它是一个众所周知的原则,当设计返回数组的方法时,应始终至少返回一个空数组,而不是零
解决方法
这是因为uniq!修改自我,如果uniq!将返回一个值,您将无法知道是否在原始对象中实际发生更改.
var = %w(green green yellow) if var.uniq! # the array contained duplicate entries else # nothing changed end
在您的代码中,您可以简单地写
hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/) hooks.uniq! #here hooks is already changed
如果你需要返回钩子的值,可能是因为它是最后一个方法声明
def method hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/) hooks.uniq end
或其他
def method hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/) hooks.uniq! hooks end