`
qzriso
  • 浏览: 242534 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

Enumerable模块

阅读更多

可枚举模块。 Enumerable mixin 是含有几组遍历与查寻方法的集合类,而且它还有排序的能力。

如果你希望自己的类也具有集合类这么多优秀的特点,那么这个类必须提供一个 each 方法,在这个方法内,它产生连续的集合成员。即依次返回你自己集合类的元素。然后再在你的类中混合插入 Enumerable 模块,你的类就可支持 map include? find_all? 等方法了。若你集合内的元素再支持 <=> 方法,即集合内的元素混合插入了 Comparable 模块,那么这个集合也可以得到 min max sort 等方法。

 

实例方法:

(1) enum.all? [{|obj| block } ] => true or false enum.any? [{|obj| block } ] => true or false 将集合内的每个元素传递给块。即依次为集合内的各个元素来执行块的内容。当所有元素为真时, all 返回 true 。当所有元素为假时, any 返回 false 。如果忽略了 block 块,则 Ruby 会偷偷地添加一个 {|obj|obj} 块。

例如:

%w{ ant bear cat}.all? {|word| word.length >= 3} #=> true

%w{ ant bear cat}.all? {|word| word.length >= 4} #=> false

[ nil, true, 99 ].all? #=> false

 

%w{ ant bear cat}.any? {|word| word.length >= 3} #=> true

%w{ ant bear cat}.any? {|word| word.length >= 4} #=> true

[ nil, true, 99 ].any? #=> true

 

(2) enum.collect {| obj | block } => array enum.map {| obj | block } => array 依次为 enum 内的每个元素执行块 block 的内容,并将结果存入一个新数组中,最后返回该数组。

例如:

(1..4).collect {|i| i*i } #=> [1, 4, 9, 16]

(1..4).collect { "cat" } #=> ["cat", "cat", "cat", "cat"]

省略块时,会执行 obj.collect {|item| item} 这等同于 Enumerable#to_a

注: collect 有收集,采集的含义。

(3) enum.each_with_index {|obj, i| block } → enum 对于 enum 内的每个条目,使用元素及其索引进行循环操作的迭代器,即使用两个参数调用块。并返回 self

例如:

hash = Hash.new

%w(cat dog wombat).each_with_index {|item, index|

hash[item] = index }

hash #=> {"cat"=>0, "wombat"=>2, "dog"=>1}

 

(4) enum.detect(ifnone = nil) {| obj | block } => obj or nil enum.find(ifnone = nil) {| obj | block } => obj or nil 传递 enum 内的每个元素给块 block 进行计算,返回计算值首次为真的那个元素。若块的计算始终都不为真的话,则计算 ifnone 部分 ( 如果有的话 ) 并返回它的值,或者返回 nul

例如:

(1..10).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> nil

(1..100).detect {|i| i % 5 == 0 and i % 7 == 0 } #=> 35

注: detect find 单词都有查明真相的意思,用在这个方法上,是因为它要查出每个元素经过计算后的真相,即是否为真。

 

(5) enum.find_all {| obj | block } => array enum.select {| obj | block } => array 在使用元素进行块计算时,若计算值为真,则把该元素存入数组,最后返回该数组。若块的计算始终都不为真时,则返回空数组。

例如:

(1..10).find_all {|i| i % 3 == 0 } #=> [3, 6, 9]

注: select 有挑选的意思。把计算后为真的元素挑选出来。

 

(6) enum.grep(pattern) => array enum.grep(pattern) {| item | block } => array pattern === item ,则把该元素存入数组,最后返回该数组,若带块调用时,则会依次为所有满足上述条件的元素来执行块的内容,并把计算结果存入到数组,最后返回该数组。若没有符合条件的元素时,返回空数组。

例如:

(1..100).grep 38..44 #=> [38, 39, 40, 41, 42, 43, 44]

 

c = IO.constants

c.grep(/SEEK/) #=> ["SEEK_END", "SEEK_SET", "SEEK_CUR"]

res = c.grep(/SEEK/) {|v| IO.const_get(v) }

res #=> [2, 0, 1]

注: grep 这个单词在 UNIX 中是一个工具程序。可用做文件内的字符串查找。

 

(7) enum.inject(initial) {| memo, obj | block } => obj enum.inject {| memo, obj | block } => obj 在每一步骤中, memo 要被设置为由块计算后返回的值。首先,用 initial 初始化 memo 的值,并将 memo obj 参数传递给块进行计算。然后将上步块计算后的值赋值给 memo 后,再继续计算块,以此类推。

其中, enum 集合中的每个元素依次赋值给 obj 。而 memo 的初始是 initial ,尔后则是由 block 块计算出来的值。这样一直循环到 enum 的最后元素,并将最后的块的计算结果返回。

若省略了初始值 initial 的话,开始时会把第 1 和第 2 个元素传递给块。 此时,若只有 1 个元素时,将直接返回首元素,而不会执行块。 若没有元素,则返回 nil

例如:求和的计算

p [1,2,3,4,5].inject(0) {|result, item| result + item } #=> 15

这等同于

result = 0

[1,2,3,4,5].each {|v| result += v }

p result #=> 15

再如:

# 查找最长的单词

longest = %w{ cat sheep bear }.inject do |memo,word|

memo.length > word.length ? memo : word

end

longest #=> "sheep"

# 查找最长单词的长度。

longest = %w{ cat sheep bear }.inject(0) do |memo,word|

memo >= word.length ? memo : word.length

end

longest #=> 5

注:这个方法之所以用 inject 这个单词,是因为这个方法有个注射动作,即将 initial 及后来的块计算结果注入到 memo 中。

 

(8) enum.include?(obj) => true or false enum.member?(obj) => true or false obj== 某元素时,返回真。

 

(9) enum.max => obj enum.max {|a,b| block } => obj

enum.min => obj enum.min {| a,b | block } => obj 返回最大与最小的元素。不带块的第一种形式是假设 enum 的所有元素都实现了 Comparable 模块。第二种形式块使用 <=> 来判断 enum 内各个元素的大小。通常要求该块返回下列各整数值:当 a>b 时返回正整数, a==b 时返回 0 ,而 a<b 时返回负整数。若该块返回了一个非整数值时,会引发 TypeError 异常。

例如:

a = %w(albatross dog horse)

a.min #=> "albatross"

a.min {|a,b| a.length <=> b.length } #=> "dog"

 

a.max #=> "horse"

a.max {|a,b| a.length <=> b.length } #=> "albatross"

 

(10) enum.partition {| obj | block } => [ true_array, false_array ] 若对某元素执行块的结果为真,则把该元素归入第一个数组;若为假则将其归入第二个数组 , 最后生成并返回一个包含这两个数组的新数组。

例如:

(1..6).partition {|i| (i&1).zero?} #=> [[2, 4, 6], [1, 3, 5]]

注:硬盘的分区就使用这个单词。只是没有想到我们要操作的一些对象,也可以被“分区”的。

 

(11) enum.reject {| obj | block } => array enum 内的各元素依次传入块中进行计算,若计算值为假则将该元素存入数组,最后返回该数组。

例如:

(1..10).reject {|i| i % 3 == 0 } #=> [1, 2, 4, 5, 7, 8, 10]

注: reject 有不合格者,不合格品的意思。

 

(12) enum.sort => array enum.sort {| a, b | block } => array 对所有元素进行升序排列后返回这个新的数组。若不带块时,将以 <=> 方法的比较结果为基础进行排序。如果想借用 <=> 之外的方法进行排序时,可以指定一个块。此时将以块的计算结果为基础进行排序。通常要求该块返回下列各值:当 a>b 时返回正整数, a==b 时返回 0 ,而 a<b 时返回负整数。若该块返回了一个非整数值时,会引发 TypeError 异常。

Enumerable#sort 所进行的是不稳定的排序 (unstable sort)

注:排序后,若相等的元素的位置并未改变的话,这种排序就是 " 稳定的排序 (stable sort)"

例如:

%w(rhea kea flea).sort #=> ["flea", "kea", "rhea"]

(1..10).sort {|a,b| b <=> a} #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

分享到:
评论

相关推荐

    Prototype Enumerable对象 学习第1/2页

    在Prototype框架中,很多对象如Array、Hash、ObjectRange以及与DOM和AJAX相关的对象都混合了Enumerable模块,使得这些对象能够利用Enumerable的方法。 Enumerable模块的设计理念类似于某些面向对象语言中的抽象基类...

    Prototype源码浅析 Enumerable部分(二)

    在JavaScript的Prototype库中,Enumerable模块提供了一系列用于处理集合(如数组)的方法,极大地扩展了JavaScript的迭代功能。本文将重点解析Enumerable中的`$break`和`$continue`概念,以及`grep`方法的设计思想。...

    llama-enumerables:与Llamas一起练习Enumerable模块

    欢迎来到拉马农场! 要使其运行: 将此存储库克隆到您的计算机。 运行bundle install 运行rspec llama_farm_spec.rb 里面有什么? data.rb:看一下数据......llama.rb:这是骆马...... llama_farm.rb:骆驼的集合,...

    j-enum:Enumerable 和 Enumerator 的实现

    在Ruby编程语言中,Enumerable模块和Enumerator类是两个非常核心且强大的工具,它们为处理集合数据提供了丰富的功能。本文将深入探讨这两个概念的实现、用途以及如何在实际编程中运用它们。 首先,Enumerable模块是...

    ruyb1.9.3标准库帮组文档

    2. **Enumerable模块**:Ruby的Enumerable模块提供了一组方便的数据处理方法,如`each`, `map`, `select`, `inject`等,可以遍历并操作数组、哈希等可枚举对象。 3. **String类**:Ruby的字符串处理非常强大,...

    Enumerable.js:适用于所有类型集合的实用函数

    这个库很大程度上受到 Ruby 的 Enumerable 模块的启发,并借用了它的大量功能。 注意:这并不意味着是一个独立的库,而是要与具有.each方法的另一种数据类型结合使用。安装作为 NPM 模块npm install enumerable-js ...

    enumerable-methods

    该项目展示了Ruby Enumerable模块中方法的重建列表。 重写的Enumerable方法是: 每个-&gt; my_each each_with_index-&gt;​​ my_each_with_index 选择-&gt; my_select 全部? -&gt; my_all? 任何? -&gt; my_any? 没有...

    函数式-确定性-Ruby取笑___下载.zip

    9. **Enumerable模块**:Ruby的Enumerable模块提供了一整套函数式编程工具,如`each`, `all?`, `any?`, `none?`, `find`, `count`等,这些都是在处理集合时非常有用的函数。 10. **Proc和Lambda**:两者都是Ruby中...

    开源项目-linkosmos-mapop.zip

    Enumerable模块是Ruby中非常重要的一个部分,它提供了一套强大的集合操作方法,如map、select、reduce等,使得处理数组、范围等各种可枚举对象变得极其便利。然而,在处理更复杂的键值对数据结构,如map[string]...

    prototype demo

    例如,Enumerable模块提供了诸如`each`, `map`, `select`, `reject`等迭代方法,Element模块则扩展了JavaScript的DOM元素,增加了如`addClassName`, `removeClassName`等便捷操作,而String模块则增强了字符串对象,...

    ruby文档方面的资料

    Enumerable模块包含了大量处理集合的便利方法,如`each`, `map`, `select`等。 异常处理在Ruby中使用`begin..rescue..end`结构,允许程序在出现错误时进行恢复。Ruby还支持自定义异常类,方便扩展。 Ruby on Rails...

    ruby实用函数和实例

    此外,Enumerable模块是一组用于遍历和操作集合的强大工具,它包含的`inject`和`reduce`方法可以执行聚合操作,`group_by`则可以按条件对元素分组。 Ruby的模块(Module)和类(Class)系统使得代码组织和复用变得...

    Ruby学习资料chm

    9. blocks和迭代器:Ruby的Enumerable模块提供了许多内置的迭代器,如each、map等,结合blocks可以方便地进行数据处理。 在"Ruby学习资料chm"中,可能涵盖以下内容: 1. Ruby基础语法:包括变量、常量、运算符、...

    Ruby程序设计高级教程

    - Enumerable模块:提供迭代功能。 - Singleton模块:确保一个类只有一个实例。 - **Require, load和include**:如何加载其他文件或模块。 #### 九、异常 - **异常处理**:try...rescue...else...ensure结构的...

    prototype1.6.0.3.rar

    除了上述功能,Prototype还包含了一些实用工具,如Enumerable模块中的各种集合操作方法,Object.extend()用于对象合并,以及Hash类用于键值对存储等。 综上所述,Prototype 1.6.0.3版本通过“prototypejs.js”文件...

    描述性统计

    描述性统计概述此gem向Enumerable模块添加了一些方法,从而可以轻松计算包含Enumerable的集合(例如Array,Hash,Set和Range)中数字样本数据的基本描述统计量。 可以计算的统计信息是: 数字和意思是中位数模式方差...

    enumerables:实现Ruby可枚举方法

    在Ruby编程语言中,Enumerable模块是一组非常强大的工具,它为集合对象提供了各种迭代方法,使得我们可以方便地处理数组、哈希等数据结构。本文将深入探讨如何实现Ruby的可枚举方法,以及这些方法在实际编程中的应用...

    Ruby on Rails 指南 v5.0.1 中文版

    - **Enumerable的扩展**:解释Enumerable模块的扩展方法。 - **Array的扩展**:列举Array类被扩展后的新方法。 - **Hash的扩展**:展示Hash类的扩展方法。 - **Regexp的扩展**:说明Regexp类的扩展方法。 - **Range...

    flatten_as.cr:添加类似于枚举的Enumerable#flatten_as,并具有对所扁平化内容的编译时间控制

    在Crystal编程语言中,`flatten_as.cr`是一个扩展了Enumerable模块的功能,增加了`#flatten_as`方法。这个方法与已有的`#flatten`方法类似,用于将嵌套的集合(如数组或范围)扁平化为单一层次的结构。但`#flatten_...

    Advanced_ruby_building_blocks_Projects

    项目1:气泡排序排序算法是《计算机科学》中最常用的最早的...项目2:可数方法您了解了将Enumerable模块混入Array和Hash类(以及其他类)并为您提供了许多方便的迭代器方法。 为了证明它没有魔力,您将重建那些方法。

Global site tag (gtag.js) - Google Analytics