Ruby数组中容易忽视的Suboptimal代码

首先解释下什么是Suboptimal,根据翻译来看就是未达标准的,非最优的。 本文主要介绍下一些数组中比较细节的但很容易被开发人员忽视的非最优使用方法。

1.寻找Array中满足条件的第一个值

很多人可能会使用以下方法:

1
  [1,2,3].select {|x| x > 1 }.first

但其实有更好的有效率的替代方法:

1
  [1,2,3].detect {|x| x > 1 }

为什么说detect方法更有效率呢,因为select内部会遍历所有的元素,而且会生成新的对象, 而detect方法会在找到第一个满足的值就直接返回退出了。

2.使用reverse循环的时候应该使用reverse_each方法

很多人会使用如下方法:

1
[1,2,3].reverse.each {|x| x+1 }

更好的替代方法如下:

1
[1,2,3].reverse_each {|x| x+1 }

因为先reverse再做each的话会做2遍循环,而reverse_each内部只需做一次循环。

3. 寻找Array中满足条件的是否存在

很多人会这么写:

1
[1,2,3].select {|x| x > 1 }.empty?

更好的替代方法如下:

1
[1,2,3].none? {|x| x > 1 }

原因和第一个一样,select会遍历所有,而none?会遇到满足第一个条件的而停下来返回false。

4. 不要使用连续的select查询用一个select代替

有人会这么写:

1
[1,2,3,4].select {|x| x > 1 }.select {|x| x < 4 }

但最好写成一个select就可以了

1
[1,2,3,4].select {|x| x > 1 && x < 4 }

这个原因很明显就不解释了,感觉犯这种错误的人应该也不多。

5. 计算数组满足条件的值的长度

很多人会这么写:

1
[1,2,3].select {|x| x > 1 }.size

下面这种写法效率会更高点:

1
[1,2,3].count {|x| x > 1 }

select这种写法会生成新的对象,而下面count不会。

6. map后面做flatten操作

很多人会这么写:

1
[1,2,3].map {|x| [x,x+1] }.flatten

更有效率的写法如下:

1
[1,2,3].flat_map {|x| [x, x+1]}

原因是上面做的循环次数比下面方法多。

评论