lgn21st 发表于 2013-2-4 20:21:00

被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]
查看完整版本: 被Array.uniq!咬到