我在查看 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. MVC controller的Action获取HttpRequest

    HttpContext.ApplicationInstance.Context.Request

  2. laravel with嵌套的渴求式加载

    今天在通过需求表A查询场地类型表B,然后通过表B的场地类型id去查询表C场地类型名的时候遇到了一个小的问题. 需求表A的字段:id.user_id .name等等: 中间表B的字段:id.appeal ...

  3. java基础易混点

    1.进制转换由低到高:byte<short(char)<int<long<float<double 2.java八种基本数据类型(存在栈里):  整数类型  byte,s ...

  4. 浏览器相关--H5本地存储

    因为项目需要,最近研究了一下HTML5本地存储相关的东西,在这简单的记录一下. 浏览器存储主要包括一下几个部分1. cookie2. localStorage3. sessionStorage4. i ...

  5. js实现简单的评论和回复功能(数组版)

    var method={ getDate:function (a,b){ //获取当前日期 //a表示年月日直接的分隔符,b表示时分秒之间的分隔符 var dateStr="", ...

  6. springMVC <mvc:interceptors>拦截器的使用

    首先在springMVC.xml配置如下代码 <!-- 拦截器 --> <mvc:interceptors> <bean class="com.base.Acc ...

  7. iOS-建设银行破解分享

    https://i.cnblogs.com/Files.aspx 建设银行破解分享 问题描述一• 在越狱手机上控制银行客户端自动获取流水,并发送到服务器. 问题描述二• 怎么控制 • 通过在越狱手机上 ...

  8. 死磕salt系列-salt grains pillar 配置

    grains 和 pillar 对比: Grains:存放静态数据,主要存储客户端的主机信息,重启grains会刷新. Pillar: 处理敏感数据, 处理差异性的文件. Grains数据系统 sal ...

  9. G、CSL 的训练计划【BFS 贪心】(“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛)

    题目传送门:https://ac.nowcoder.com/acm/contest/551/G 链接:https://ac.nowcoder.com/acm/contest/551/G来源:牛客网 题 ...

  10. 【jQuery】动画小练习

    1.jQuery部分代码如下 <script type="text/javascript"> $(function(){ var page = 1; var i = 4 ...