我在查看 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. 实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)

    //校验是否全由数字组成 function isDigit(s) { var patrn=/^[0-9]{1,20}$/; if (!patrn.exec(s)) return false retur ...

  2. 二、WPF datagrid 行变色

    public void Color(){ DataGridRow row1 = (DataGridRow)this.dgSource.ItemContainerGenerator.ContainerF ...

  3. 【Python学习】Python中的数据类型精度问题

    Python真的很神奇...神奇到没有直接的数据类型概念,并且精度可以是任意精度.想当初,第一次接触OI算法时,写得第一个算法就是高精度加法,捣鼓了半天.一切在Python看来,仅仅三行代码即可完成. ...

  4. 沉淀,再出发:VUE的简单理解

    沉淀,再出发:VUE的简单理解 一.前言 Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过 ...

  5. xss challenges平台学习

    虽然在很早之前就接触过xss,有一段时间还就着一本书研究过,但是始终没有实感,掌握的也不够系统,所以现在借着这几个平台再学习一遍 首先来玩一玩xss challenge平台 第一关:http://xs ...

  6. 双十一问题:在洪峰数据来临的瞬间,redis出现连接超时异常

    如图所示,在大数据量来袭时,部署服务的机器中存在一台机器突然出现该报错,并且一直持续下去,直到洪峰数据结束也未恢复,重启机器后该问题解决 原因分析: 在请求redis过多时,因为未及时的释放掉redi ...

  7. 有关js弹出提示框几种方法

    1直接提示只有确定功能的提示框 只显示提示信息 alert(“提示信息”); alert ();的参数只有一个就是提示信息,无返回值 2 弹出输入框让你输入内容 prompt() ; 有两个参数:第一 ...

  8. How Flask Routing Works

    @How Flask Routing Works The entire idea of Flask (and the underlying Werkzeug library) is to map UR ...

  9. HDU 4652 Dice

    嘟嘟嘟 题目大意就是对于一个m面的骰子,回答这么两个问题: 1.求连续扔n次都是同一数字的期望次数. 2.求连续扔n次每一次数字都不相同的期望次数. 对于期望dp特别菜的我来说,这道题已经算是很难了. ...

  10. Kali-linux系统指纹识别

    现在一些便携式计算机操作系统使用指纹识别来验证密码进行登录.指纹识别是识别系统的一个典型模式,包括指纹图像获取.处理.特征提取和对等模块.如果要做渗透测试,需要了解要渗透测试的操作系统的类型才可以.本 ...