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. BIEE入门(三)业务模型层

    正如它的名字所示(Business Model and Mapping Layer),业务逻辑层需要把物理层的数据源以一种业务用户的视角来重新组织物理层的各个数据源(所谓的Mapping),同时在业务 ...

  2. IIS中X509Certificate遇见的问题

    由于开发过程中需要用到证书,所以通过调用 X509Certificate2 访问p12文件. 代码开发完成后,在本地VS上测试通过,本地IIS上测试通过,发布到线上服务器IIS后不通过:提示找不到文件 ...

  3. Oracle 查看session级别信息

    1. 查看活动会话信息[sql] view plain copySELECT *    FROM V$SESSION   WHERE USERNAME IS NOT NULL     AND STAT ...

  4. May 15th 2017 Week 20th Monday

    Life is a flower of which love is the honey. 人生是花朵,爱情是花蜜. Not every life can be a flower, not every ...

  5. February 26 2017 Week 9 Sunday

    There is only one happiness in life, to love and be loved. 生命中只有一种幸福,爱与被爱. Some one told me that hea ...

  6. angular2 里父子组件传值的坑

    1.如果传的是基本类型的值,子组件里改变该值,父组件无变化 2.如果传的是对象,子组件里改变对象里的变量,父组件会变化 3.如果传的是函数,this不会继续指向父组件对象了,如果需要this指向父组件 ...

  7. OC extern和变量

    注意: extern只能用来声明全部变量,不能拿来定义变量 #include <stdio.h> // 第一种做法是将a定义在main函数的前面 // int a; // 完整地声明全部变 ...

  8. QT隐含共享类 QSharedData QSharedDataPointer

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/davidsu33/article/details/28857391 QT中非常多类都实现了隐含共享比 ...

  9. Django:web框架本质

    一,web框架本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. 1,自定义web框架 impo ...

  10. 【[USACO16OPEN]262144】

    发现这个数列的范围特别大但是值域的范围特别小 于是可以大胆猜测这道题值域肯定需要开到状态里去 又发现\(262144=2^{18}\)这个暗示非常明显啊,暗示这道题跟二进制有关系 其实也没什么关系 设 ...