我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块。Enumerable模块为集合型类提供了遍历、检索、排序等方法(collect、map、each_with_index等),该模块的方法都用到了 each ,因此那些包含了本模块的类需要预先定义 each 。

Array.ancestors
# => [Array, Enumerable, Object, Kernel, BasicObject]
Hash.ancestors
# => [Hash, Enumerable, Object, Kernel, BasicObject]

一些实用小技巧:

chunk:将返回相同块值的连续元素组合在一起

示例一:

按相同日期分组
list = [{"date"=>"","name"=>"a","times"=>20},
{"date"=>"","name"=>"b","times"=>20},
{"date"=>"","name"=>"c","times"=>20},
{"date"=>"","name"=>"a","times"=>20},
{"date"=>"","name"=>"b","times"=>20},
{"date"=>"","name"=>"c","times"=>20},
{"date"=>"","name"=>"a","times"=>20},
{"date"=>"","name"=>"b","times"=>20},
{"date"=>"","name"=>"c","times"=>20}
]
list.sort_by{|s| s["name"]}.sort_by{|s| s["date"] }.chunk{|x| x["date"]}.map(&:last)
# =>
# [
# [{"date"=>"20180615", "name"=>"a", "times"=>20}, {"date"=>"20180615", "name"=>"b", "times"=>20}, {"date"=>"20180615", "name"=>"c", "times"=>20}],
# [{"date"=>"20180628", "name"=>"b", "times"=>20}, {"date"=>"20180628", "name"=>"c", "times"=>20}, {"date"=>"20180628", "name"=>"a", "times"=>20}],
# [{"date"=>"20180630", "name"=>"c", "times"=>20}, {"date"=>"20180630", "name"=>"b", "times"=>20}, {"date"=>"20180630", "name"=>"a", "times"=>20}]
# ]

示例二:

#打印出带“def”的行
open("/Users/hhf/Desktop/work/projects/cloud-admin/app/models/user.rb") { |f|
f.chunk { |line| line =~ /def/ }.each { |key, lines|
p lines
}
} #带“def”的行单独打印出,其他行组合在一起打印 _alone使元素进入一个大块
open("/Users/hhf/Desktop/work/projects/cloud-admin/app/models/user.rb") { |f|
f.chunk { |line| line =~ /def/ ? :_alone : true }.each { |key, lines|
p lines
}
}

chunk_while: 将块值为true的连续元素组合在一起,块值为false时切分元素

[1,2,4,9,10,11,12,15,16,19,20,21].chunk_while {|i, j| i+1 == j }.to_a
# => [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]

each_slice: 按给定的个数切分元素

a=[]
(1..10).each_slice(3) { |x| a << x }
p a
# => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

drop_while:按指定条件删除元素,直到返回false时停止

a = [[1,3],[1],[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
a.drop_while { |x| x.count < 3 }
# => [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
												

Ruby中Enumerable模块的一些实用方法的更多相关文章

  1. ruby中的链式访问和方法嵌套

    先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...

  2. ruby中的模块

    什么是模块 模块(module)是Ruby特有的功能之一.类用来表现具有数据与行为(程序)的"东西", 而模块大致来说,则是只有程序部分的集合体.类与模块最大的不同在于: 1.模块 ...

  3. python中计时模块timeit的使用方法

    timeit 模块: timeit 模块定义了接受两个参数的 Timer 类.两个参数都是字符串. 第一个参数是你要计时的语句或者函数. 传递给 Timer 的第二个参数是为第一个参数语句构建环境的导 ...

  4. Linux中date命令的各种实用方法--转载

    在linux环境中,不管是编程还是其他维护,时间是必不可少的,也经常会用到时间的运算,自己也曾经为时间的各种表示方法和如何修改时间而困惑,熟练运用date命令来表示自己想要表示的时间,肯定可以给自己的 ...

  5. Linux中date命令的各种实用方法

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://521cto.blog.51cto.com/950229/935642 在linu ...

  6. console中一些不常用的实用方法

    console.group('分组1'); console.table( [ {key1: 1,key2: 2,key3: 3}, {key1: 1,key2: 2,key3: 3}, {key1: ...

  7. ruby中rsa加签解签方法

    # coding:utf-8require 'openssl'require 'base64'# rsa签名,文本内容和私钥路径def rsa_sign(data,private_key_path) ...

  8. windows下ruby中显示中文的3种方法

    A: 1将x.rb编码为ascii格式 2 在x.rb开头加上 #code:gbk或者 #coding:gbk B: 1 将x.rb编码为utf-8格式 2 在x.rb开头加上 #code:utf-8 ...

  9. python2中urllib2模块带cookies使用方法

    #!/usr/bin/python # coding=utf-8 #############方式1######################### import urllib2 cookie = & ...

随机推荐

  1. Python学习---面向对象的学习[基础]

    面向对象 面向对象的三大特性是指:封装.继承和多态. 说明: Python可以函数式编程,也可以面向对象编程 l 面向过程:根据业务逻辑从上到下写垒代码 l 函数式 :将某功能代码封装到函数中,日后便 ...

  2. January 13 2017 Week 2 Friday

    Those who turn back never reach the summit. 回头的人永远也到不了顶峰. I always turned back on my life road, so i ...

  3. 异常处理与MiniDump详解(2) 智能指针与C++异常

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一.   综述 <异常处理与MiniDump详解(1) C++异常>稍 ...

  4. [T-ARA][TIAMO]

    歌词来源:http://music.163.com/#/song?id=439915067 改了一版格式,先尝试一下,考虑到总不能永远只看着拼音读,所以想把发音按照韩文字来写,以后争取看着韩文字唱. ...

  5. window下安装好postgreSQL 9.3用cmd命令进入数据库(搞的我这个菜鸟只剩半条命)

    linux下基本没什么问题,但在window操作系统下比较麻烦. 需要添加环境变量path路径:C:\Program Files (x86)\PostgreSQL\9.3\bin 添加postgres ...

  6. 「bzoj 4184: shallot」

    权限题 线段树分治加线性基 首先这个题要求删除线性基肯定是没法处理的 于是我们套上一个线段树分治 线段树分治就是一种能够避免删除的神仙操作 我们发现询问是对一个时间的单点询问,而每一个数存在的时间却是 ...

  7. luogu P3381【模板】最小费用最大流

    嘟嘟嘟 没错,我开始学费用流了! 做法也是比较朴素的\(spfa\). 就是每一次以费用为权值跑一遍\(spfa\)找到一条最短路,然后把这条道全流满,并把这一次的流量和费用累加到答案上.因此我们需要 ...

  8. VirtualBox操作总结

    1. VirtualBox安装 下载rpm,rpm -ivh 安装 2. 在图形界面打开virtual box virtualbox 3. vboxmanage打开虚拟机 vboxmanage sta ...

  9. 日常踩坑——rand()总是出现重复数据

    写了一个生成随机数组的函数,然后跑出来,结果总是…… 然后,很奇怪的是一步一步调试,它就没问题了,WTF??? 问题出在:重复写了srand(time(NULL)),只保留一个就好了. int* ge ...

  10. Apollo2.5 CANBUS调试笔记(测试版)

    前言:CANBUS是Apollo需要根据你的底盘写代码的地方,感觉也是Apollo最难调试的部分.这部分首先要选好CAN卡,因为不是Apollo推荐的CAN卡,驱动程序和对应接口,可能都需要自己调整, ...