我只是从ruby开始,我个人认为下面的内容违反了“最小惊喜原则”。也就是说,引用the documentation,那个uniq!”从self中删除重复元素。如果未做任何更改(即未找到重复项),则返回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附加到第一行。不过,在同一个程序中,稍后我将元素推送到循环内的另一个数组中。然后,在循环下,我想对数组进行“重复数据消除”,但我不敢写“hooks\u tested.uniq!”因为它可以返回nil;相反,我必须编写hooks\u tested=hooks\u tested.uniq
事实上,我认为这是一个特别惊人的错误特性,因为众所周知,在设计返回数组的方法时,至少应该返回一个空数组,而不是零。

最佳答案

这是因为uniq!修改self并且如果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

如果需要返回hook的值,可能是因为它是最后一个方法语句
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

关于ruby - 为什么要用uniq!如果没有重复,则返回nil,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2102252/

10-14 15:04