我在查看 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. SpringMVC笔记——SSM框架搭建简单实例

    落叶枫桥 博客园 首页 新随笔 联系 订阅 管理 SpringMVC笔记——SSM框架搭建简单实例 简介 Spring+SpringMVC+MyBatis框架(SSM)是比较热门的中小型企业级项目开发 ...

  2. 网站url常见报错

    报错情况比较复杂,此处列出比较常见的几种报错内容: 报错: 报错是一个大类, 的报错基本上是权限问题,出现 报错时您需要检测权限配置问题. 403.1 错误是由于“执行”访问被禁止而造成的.若试图从目 ...

  3. Python实例---基于页面的后台管理[简单版]

    后台管理菜单 + 母板[css/content/js] 向后台提交数据[2种]:       1.  模态对话框(数据少操作,且Js复杂):        form表单 :优点:简单,前端提交后后台处 ...

  4. System.Buffer 以字节数组(Byte[])操作基元类型数据

    1. Buffer.ByteLength:计算基元类型数组累计有多少字节组成. 该方法结果等于"基元类型字节长度 * 数组长度" , , }; , , }; , , }; Cons ...

  5. 【jQuery】Deferred(延迟)对象

    本文针对jQuery-todolist项目中使用到的Deferred(延迟)对象进行具体分析 $.Deferred() 是一个构造函数,用来返回一个链式实用对象方法来注册多个回调,并且调用回调队列,传 ...

  6. 《metasploit渗透测试魔鬼训练营》学习笔记第四章—web应用渗透

    继续来学习metasploit...记好笔记是很重要的,下面开始正文: 二.WEB应用渗透技术     1.WEB应用渗透基础知识        先介绍WEB应用攻击的主要类型(大致介绍,具体请自行查 ...

  7. (转)查看mysql数据库连接数、并发数相关信息

    查看mysql数据库连接数.并发数相关信息 1.mysql> show status like 'Threads%';+-------------------+-------+| Variabl ...

  8. F-stack及其Nginx、redis的编译安装

    F-stack简介 F-stack粘合了dpdk.用户态协议栈和nginx.redis,弥补了dpdk没有协议栈的不足,并用nginx.redis提供了一个调用应用程序的接口. Quick Start ...

  9. 程序猿,你为什么须要一台mac?

    用了Mac ,我再也回不去Windows. A:帅哥,我电脑坏了. B:重装系统吧.包好! 重装系统 windows系统解决全部系统问题的一剂神药.Mac 时代再也不须要做这种劳命伤財的事情了,没有什 ...

  10. I、Python 环境搭建

    I.安装Python https://www.python.org/downloads/windows/ 下载路径总是变,认准那个名字 安装, 记住,所有语言都推荐安装在 默认路径,不要相信那些让你改 ...