ruby – 为什么uniq!如果没有重复,返回零

我只是从 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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...