Enumerable模块提供了遍历,搜索,比较,排序等方法。如果我们自定义的类需要实现这些方法,必须实现一个each方法。如果需要使用max,min,sort等方法,因为这些方法是集合的元素之间的排序,所以该类还必须使用<=>方法;

Array,Hash,Range,IO都Mix-in了该模块

一. 遍历,搜索方法

  • all? {|item| ... }
    当所有元素都为真时,返回true. 若某元素为假时, 立即返回false

    p [1,2,3].all? {|v| v > 0}   # => true
    p [1,2,3].all? {|v| v > 1} # => false
  • any? {|item| ... }
    当所有元素都为假时,返回false. 一旦某元素为真时, 立即返回true.
    p [1,2,3].any? {|v| v > 3}   # => false
    p [1,2,3].any? {|v| v > 1} # => true
  • collect {|item| ... }
    map {|item| ... }
    依此为各元素执行块的内容,并将结果存入数组,最后返回该数组
    p [1,2,3].map {|v| v + 1}   # => [2, 3, 4]
  • each_with_index {|item,index| ... }
    使用元素及其索引进行循环操作的迭代器
    ['a', 'b', 'c', 'd'].each_with_index{|obj, i| puts "#{obj} - #{i}"}
    #=>
    a - 0
    b - 1
    c - 2
    d - 3
    
    
     
  • find([ifnone]) {|item| ... }
    在使用元素进行块的计算时, 返回计算值首次为真的那个元素. 若块的计算值始终都不为真时, 则计算ifnone部分(若有的话),并返回nil.
    p [1, 2, 3, 4, 5].find{|i| i>3}    #=> 4
  • find_all {|item| ... }
    select {|item| ... }
    在使用元素进行块的计算时,若计算值为真则把该元素存入数组,最后返回该数组. 若块的计算值始终都不为真时,则返回空数组
    p [1, 2, 3, 4, 5].select{|i| i>3} #=> [4, 5]
  • member?(val)
    include?(val)
    val==某元素时,返回true
    p (1..2).include?(2) #=> true
  • inject([init]) {|result, item| ... }
    开始时,把初始值init和self的首元素当做块参数来计算块的内容. 从第2次循环开始, 将把上次的块的计算结果和self的下个元素当做块参数来计算块. 这样一直循环到最后的元素, 返回最后的块的计算结果.
    若没有元素,则返回init.
    若省略了初始值init的话, 开始时会把第1和第2个元素传递给块. 此时, 若只有1个元素时,将直接返回首元素,而不会执行块. 若没有元素,则返回nil
    p [1, 2, 3, 4, 5].inject{|sum, i| sum + i}  #=> 15i
    p [3, 4, 5].inject(2){|product, i| product * i} #=> 120
  • reduce(initial, sym)
    reduce(sym)
    reduce(initial) { |memo, obj| block }
    reduce { |memo, obj| block }
    reduce作用和inject优点类似,但是它比inject还要简洁

    # Sum some numbers
    (5..10).reduce(:+) #=> 45
    # Same using a block and inject
    (5..10).inject { |sum, n| sum + n } #=> 45
    # Multiply some numbers
    (5..10).reduce(1, :*) #=> 151200
    # Same using a block
    (5..10).inject(1) { |product, n| product * n } #=> 151200
    # find the longest word
    longest = %w{ cat sheep bear }.inject do |memo, word|
    memo.length > word.length ? memo : word
    end
    longest #=> "sheep"
  • partition {|item| ... }
    若对某元素执行块的结果为真, 则把该元素归入第一个数组;若为假则将其归入第二个数组,最后生成并返回一个包含这两个数组的新数组.
    p [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0].partition { |i| i % 3 == 0 }
    #=> [[9, 6, 3, 0], [10, 8, 7, 5, 4, 2, 1]]
  • group_by { |obj| block } → a_hash 
    group_by → an_enumerator
    根据块的结果对集合进行分组。返回一个散列,其中键是来自块的评估结果,值是集合中与键对应的元素数组
    如果没有给定一个区块,则返回一个枚举器enumerator

    (1..6).group_by { |i| i%3 }   #=> {0=>[3, 6], 1=>[1, 4], 2=>[2, 5]}

二. 比较,排序方法

  • max {|a, b| ... }

    以块的计算结果来判断各个元素的大小, 并返回最大的元素.

    通常要求该块返回下列各整数值: 当a>b时返回正整数,a==b时返回0,而a<b时返回负整数. 若该块返回了一个非整数值时, 会引发TypeError异常

    arr = ['string', 'array', 'enumberable']
    p arr.max #=> "string"
    p arr.max{|a, b| a.length <=> b.length} #=> "enumberable"
  • min {|a, b| ... }
    以块的计算结果来判断各个元素的大小, 并返回最小的元素.
    通常要求该块返回下列各整数值: 当a>b时返回正整数,a==b时返回0,而a<b时返回负整数. 若该块返回了一个非整数值时, 会引发TypeError异常.
  • sort {|a, b| ... }
    对所有元素进行升序排列后返回这个新的数组.
    若不带块时, 将以<=>方法的比较结果为基础进行排序.
    如果想借用<=>之外的方法进行排序时,可以指定一个块. 此时将以块的计算结果为基础进行排序. 通常要求该块返回下列各值: 当a>b时返回正整数,a==b时返回0,而a<b时返回负整数. 若该块返回了一个非整数值时, 会引发TypeError异常.
    Enumerable#sort 所进行的是不稳定的排序(unstable sort)。
    注: 排序后,若相等的元素的位置并未改变的话,这种排序就是"稳定的排序(stable sort)".
    p [1, 3, 4, 2].sort #=> [1, 2, 3, 4]
  • sort_by {|item| ... }
    <=>方法来比较块的计算值, 并对self进行升序排列,最后生成并返回新生成的数组
    p ['string', 'array', 'enumberable'].sort_by{|world| world.length}
    #=> ["array", "string", "enumberable"]

ruby 可枚举模块Enumerable的更多相关文章

  1. C#的枚举数(Enumerator)和可枚举类型(Enumerable)

    数组可以被foreach语句遍历数组中的元素,原因是数组可以按需提供一个叫做枚举数(enumerator)的对象.枚举数可以依次返回请求的数组的元素. 对于有枚举数的类型而言,必须有一个方法来获取它们 ...

  2. ruby迭代器枚举器

    迭代器一个迭代器是一个方法,这个方法里面有yield语句,使用了yield的方法叫做迭代器,迭代器并非一定要迭代,与传递给这个方法的块进行数据传输 yield将数据传给代码快,代码块再把数据传输给yi ...

  3. 由枚举模块到ring0内存结构 (分析NtQueryVirtualMemory)

    是由获得进程模块而引发的一系列的问题,首先,在ring3层下枚举进程模块有ToolHelp,Psapi,还可以通过在ntdll中获得ZwQuerySystemInformation的函数地址来枚举,其 ...

  4. Ruby类,模块1

    类的扩展和继承 class Fixnum def dosome(str) puts str end def abs puts "覆盖了原有的方法" end end puts 1.c ...

  5. js对象中什么是可枚举性(enumerable)?

    说到枚举,可能很多人都会想到枚举类型,但在javascript对象中有一个属性为可枚举性,他是什么呢? 概念 可枚举性(enumerable)用来控制所描述的属性,是否将被包括在for...in循环之 ...

  6. ruby中的模块

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

  7. ruby net/http模块使用

    ruby中的NET::HTTP:这里暂时先列出几个固定用法: 其中一,二不支持请求头设置(header取ruby默认值),只能用于基本的请求,不支持持久连接,如果您执行许多HTTP请求,则不推荐它们: ...

  8. VadRoot枚举进程模块在Windows7下的完整实现

      原理小伟的小伟在http://bbs.pediy.com/showthread.php?t=66886说的挺清楚了,Windows7下有一些变化,使用NtQueryVirtualMemory来枚举 ...

  9. Ruby On Rails 常用的精品Gem汇总

    首先需要注明一点,本文是原创的并不是从其它地方转载.所有的数据是我从 GitHub 和 RubyGems 上码下来的,数据的截取时间就是本文的发布日期. RubyGems 的下载量可以看到在用这个 g ...

随机推荐

  1. zip4j之加压解压

    最近看同事搞个文件打包,搞了大半天,还是有问题!嗨~~ 网上明明有现成的,偏偏要自己写! 下面是基于zip4j实现加压解决的简单工具类 package com.learcher.zip; import ...

  2. 如何让一个简单的maven项目支持one-jar 做成一个jar fatjar

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  3. BZOJ4538:[HNOI2016]网络(树链剖分,堆)

    Description 一个简单的网络系统可以被描述成一棵无根树.每个节点为一个服务器.连接服务器与服务器的数据线则看做 一条树边.两个服务器进行数据的交互时,数据会经过连接这两个服务器的路径上的所有 ...

  4. Android学习笔记_78_ Android开发中使用软引用和弱引用防止内存溢出

    在<Effective Java 2nd Edition>中,第6条“消除过期的对象引用”提到,虽然Java有 垃圾回收机制,但是只要是自己管理的内存,就应该警惕内存泄露的问题,例如的对象 ...

  5. EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法

    EF:修改不是查询出来的对象dbContext.Web_User.AddOrUpdate(user);dbContext.SaveChanges(); 上面的写法有时候可能不起作用,而且把这条数据重复 ...

  6. 第13章 GPIO输入—按键检测

    本章参考资料:<STM32F76xxx参考手册>.库帮助文档<STM32F779xx_User_Manual.chm>. 按键检测使用到GPIO外设的基本输入功能,本章中不再赘 ...

  7. PL/SQL知识点

    1.ROW_NUMBER() OVER(PARTITION BY XXX ORDER BY XXX) SELECT STP.FLOW_INST_ID, BUU.USER_NAME, ORGG.NAME ...

  8. 我的wmware

    1.vmware 网络连接方式 NAT 模式: 虚拟机的IP 是由NAT分配的,电脑环境无论如何变化,都不会影响虚拟机 好处:在家.学校.公司,连接虚拟机都可以使用相同的ip地址 桥接模式: 只要更换 ...

  9. java中String、包装类、枚举类的引用传递

    一般情况下,我们认为Java中了除了八种基本数据类型,其他都是对象,进行引用传递: 但是:String.包装类.枚举类作为参数传递后发现,没有达到引用传递的效果,很多人认为它是值传递! 首先,对象肯定 ...

  10. 在cengos中安装zabbix server/agent, 并创建一个简单demo

    添加zabbix更新源 rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch ...