我刚开始使用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)
感叹号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)