分享 Ruby map、each、select、inject、collect 、detect reference

noob · 2015年07月31日 · 最后由 Garfield429 回复于 2017年08月04日 · 10215 次阅读

感觉在像写个人日志一样,这些小知识不知道能不能帮到大家,同时也希望大牛们多多指教,多多传授一下工作中常用的技术或者方法,小菜谢过了

map:(collect 是 map 的别名函数)

对数组中每个元素进行表达式操作,原始数组不会被改变,返回执行表达式结果的新数组

[1,2,3,4,5,6,7,8,9,10].map{|e| e*3}  
=> [3, 6, 9, 12, 15, 18, 21, 24, 27, 30] 
[1,2,3,4,5,6,7,8,9,10].collect{|e| e == 3} 
=>[false, false, true, false, false, false, false, false, false, false]

each: 常用作数组的循环操作,对循环的参数做表达式操作,原数组不会被改变,返回原始数组

eg[1,2,3,4,5,6,7,8,9,10].each{|e| print e.to_s + "###"} 
    => 1###2###3###4###5###6###7###8###9###10### =>返回 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 

select: 相当于过滤器,返回符合表达式元素的新数组,如果所有都不符合表达式则返回空数组

 eg[1,2,3,4,5,6,7,8,9,10].select{|e| e == 3}
   =>  [3] 
eg[1,2,3,4,5,6,7,8,9,10].select{|e| e*3}
  => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

detect:(find 的别名函数) 返回列表中第一个符合条件的元素

eg[1,2,3,4,5,6,7,8,9,10].detect{|e| e == 3 || e == 2}
   =>  2 

inject: 在所声明的容器中注入符合条件的元素,累加器作用

eg[1,2,3,4,5,6,7,8,9,10].inject{ |sum,e| sum += e } 其中sum为所声明的注入器 将累加后的结果最后注入到sum中并返回注入器最后结果
eg[1,2,3,4,5,6,7,8,9,10].inject{|result,elem| result + elem} => 55
  此时inject没有带参数这是result会为数组中第一个元素elem为第二个元素依次累加返回最后结果 
eg:  {1 => 'a',2 => 'b',3 =>'c'}.inject({}){|key,value| value} key => {} value => [3,'c'] 

reject: 去除列表中符合条件的元素

eg[1,2,3,4,5,6,7,8,9,10].reject{|e| e==2 || e==8}
   => [1, 3, 4, 5, 6, 7, 9, 10] 

如果能注意下格式,确实能帮到部分人,这样的格式我都看不下去

#1 楼 @jasonliu 好的好的,现在立马更改下

@noob ruby 中一般这样写:

(1..9).to_a.map { |e| e * 3 }

#5 楼 @roclv 恩恩谢谢提出,是的 array 的写法确实有好多,只是觉得这种表达形式直观一些

#5 楼 @roclv Or, 1.upto(10).map ...

eg:  {1 => 'a',2 => 'b',3 =>'c'}.inject({}){|key,value| value} key => {} value => [1,'a']  

结果好像错的吧,我运行的结果:

> {1 => 'a',2 => 'b',3 =>'c'}.inject({}){|key,value| value}
=> [3, "c"]

#9 楼 @caiqinghua 嗯嗯,确实错了,谢谢提出,我会更改过来。

收下了

[1,2,3,4,5,6,7,8,9,10].inject{ |sum,e| sum += e } 写成这样: 1.upto(10).inject(&:+)

还有一个和 inject() 方法类似的方法 reduce()

推荐的 ruby 代码风格中提到:倾向使用 map 而不是 collect,find 而不是 detect,select 而不是 find_all,reduce 而不是 inject 以及 size 而不是 length。

ActiveRecord::Relation 对象调用 each 时,原集合会变,所以 each 和 map 的根本区别是,返回原来的集合,还是执行代码块儿后的返回值所组成的新集合。ruby 新手,亲测

需要 登录 后方可回复, 如果你还没有账号请 注册新账号