被Array.uniq!咬到
Ruby Array的方法命名规则可以简单的这么理解:将值存入先前分配的存储位置的过程常以"!"结尾
比如{map,map!},{flatten,flatten!},{reject,reject!}
我要说的是Array.uniq!方法
按照我的直觉理解,如果一个数组对象,调用uniq方法,返回一个新的且uniq过的数组对象
如果调用uniq!方法,那么将直接修改原来的数组对象,去除重复的数组元素
但是我发现我错了,ruby 1.8.6并不是这么理解
array.uniq! → array or nil
Removes duplicate elements from self. Returns nil if no changes are made (that is, no duplicates are found).
a = [ "a", "a", "b", "b", "c" ]
a.uniq! #=> ["a", "b", "c"]
b = [ "a", "b", "c" ]
b.uniq! #=> nil
遇到之前还真不知道这里原来是这样,以前狂用这个方法还屡试不爽呢!,昨天被这个问题折磨至少两个小时找不到方向,程序就告诉我你错了,你不要调用nil的方法,我后来甚至在怀疑自己是不是做梦,我sigh~~~
ruby的原则是最小惊讶,一旦理解,一切将变得理所当然.不过这里着实跟我理解的不一样,ruby的想法可能是这样么?
如果调用这个方法,我返回给你一个uniq的数组,证明你原来的数组有重复元素,那么好的你已经得到了一个筛选过的数组.如果我返回给你一个nil,那么你给我的数组就是uniq的,你就别没事找事啦,早点洗洗睡吧.
所以,如果想用uniq!并得到一个uniq的数组之前,你一定要自己知道数组中有重复的元素,否则,还是用更靠谱的uniq吧.
---------- 后记 ----------
经Martin Xu提醒
<div class="quote_title">引用
页:
[1]