为什么uniq!如果没有重复,则返回nil

Geo*_*pty 11 ruby arrays uniq

我刚开始使用Ruby,我个人发现以下内容违反了"最少惊喜原则".也就是说,引用文档,那就是uniq!"从self中删除重复的元素.如果没有进行任何更改,则返回nil(即没有找到重复项)."

任何人都能解释一下,这对我来说似乎完全违反直觉吗?这意味着,而不是通过附加.uniq来编写下面的一行代码!要结束第一行,我必须编写以下两行:

  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks = hooks.uniq
Run Code Online (Sandbox Code Playgroud)

或者我错过了什么,更好的方法?

编辑:

我明白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
Run Code Online (Sandbox Code Playgroud)

我认为uniq的方式!作品使它完全无意义和无用.在我的情况下,我指出我可以将.uniq附加到第一行.但是后来在同一个程序中,我将元素推送到循环内的另一个数组中.然后,在循环下,我想"删除"数组,但我不敢写'hooks_tested.uniq!' 因为它可以返回零; 相反,我必须写hooks_tested = hooks_tested.uniq

事实上,我认为这是一个特别令人震惊的错误特征,因为它是一个众所周知的原则,当设计一个返回数组的方法时,应该总是至少返回一个空数组,而不是nil

Sim*_*tti 10

这是因为uniq!修改self并且如果uniq!返回一个值,您将无法知道原始对象中是否实际发生了更改.

var = %w(green green yellow)
if var.uniq!
  # the array contained duplicate entries
else
  # nothing changed
end
Run Code Online (Sandbox Code Playgroud)

在你的代码中你可以简单地写

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks.uniq!
# here hooks is already changed
Run Code Online (Sandbox Code Playgroud)

如果你需要返回hook的值,也许是因为它是最后一个方法语句

def method
  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks.uniq
end
Run Code Online (Sandbox Code Playgroud)

或者其他

def method
  hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
  hooks.uniq!
  hooks
end
Run Code Online (Sandbox Code Playgroud)


mck*_*eed 5

感叹号on uniq!表示它修改数组而不是返回新数组.你应该做这个:

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/).uniq
Run Code Online (Sandbox Code Playgroud)

或这个

hooks = IO.read(wt_hooks_impl_file).scan(/wt_rt_00\w{2}/)
hooks.uniq!
puts hooks.length
Run Code Online (Sandbox Code Playgroud)