`

ruby之enumerator

    博客分类:
  • ruby
阅读更多
由于版本的变更,1.8与1.9在许多地方是不一样的,API变化很大,虽然理论上说1.9要好,但是目前有很多应用还是基于1.8的,在windows玩ruby更是如此,因此必须得注意这两个版本间的一些区别,比如说Enumerator,首先Enumerator是一个类,代码如:
class Enumerator
    include Enumerable
.....

从上面这段代码可以看出,一个Enumerator对象就是一个Enumerable对象。但Enumerator与Enumerable目的是不同的,Enumerator目的在于枚举其它的对象。主要作用有两个:
一、作为Enumerable的代理对象。如to_enum等,返回一个不可变的代理Enumerator。

创建一个Enumerator对象也很简单,一般使用Object的to_enum或enum_for方法。to_enum返回一个可枚举但不可变的代理对象。

遍历数据加上索引时,
在1.8中
require 'enumerator'
foo.to_enum(:each_with_index).collect {|x,i| }

其中each_with_index是一个迭代器方法,即基于each_with_index的方式来迭代。
也可以这样:
require 'enumerator'
[1,2,3].enum_with_index.map{|x, i| }

在本人机子上装的是1.8.7,此版本已经内置了enumerator,所以不用require 'enumerator'也是可以运行的,包括each_slice也是。
在1.9中:
#map也可以
foo.collect.with_index {|x,i| }

两个版本的用法之所以不同,是因为在1.8中,collect或map返回的是一个Array对象,而在1.9中,返回的是却是Enumerator对象,只有Enumerator才有with_index方法,可能在1.8.7前的版本没有with_index,但是在1.8.7中是有with_index方法的。下面代码在1.8.7与1.9.1中都是可以运行的。
s="hi, how are you!"
s.each_char.with_index{ |args,arg|  }


二、作为外部迭代器使用。

Enumerator有个next方法,用于返回下一个元素,但是没有next?之类的方法,所以需要通过StopIterator异常来判断。而在1.9中(其实187也是可以的),Kernel.loop包含了一个隐式的rescue语句,如果此方法内部抛出StopIterator异常,循环将中止。如:
iterator = 9.downto(1);
loop do
  print iterator.next
end


关于内部迭代器与外部迭代器:
引用

一个基本的问题是决定到底由哪一方来控制迭代,是迭代器自身还是使用迭代器的客户代码?当客户代码控制迭代时,该迭代器被称为外部迭代器,反之当迭代器控制迭代时,该迭代器就是一个内部迭代器。那些使用外部迭代器的客户代码必须负责推进整个遍历过程并且显式的从迭代器中获得下一个元素。相比之下,在使用内部迭代器时,客户代码将一个操作传递给一个内部迭代器,该迭代器依次在每个元素上应用该操作。
外部迭代器比内部迭代器更灵活。比如,使用外部迭代器可以很容易的比较两个集合的相等性,如果用内部迭代器则不太可能。但是从另一个角度来看,内部迭代器更容易使用,因为它们已经为你定义好了迭代逻辑。
在Ruby中,像each这样的迭代器方法是内部迭代器,它们控制着迭代并且将值“推送”给那个与方法调用相关联的代码块。Enumerator枚举器具有一个each方法,可用于内部迭代,但是在Ruby1.9及其后的版本里,它们还能充当外部迭代器,客户代码可以使用next方法顺序的从一个枚举器中“取出"值。
分享到:
评论

相关推荐

    学习 Ruby 的笔记以及 Demo.zip

    9. Blocks与Enumerator:Ruby的Enumerator类允许你遍历任何可迭代对象,并且可以与其他数据结构结合,实现复杂的迭代操作。 10. Rails框架:Ruby最有名的应用莫过于Ruby on Rails,这是一个快速开发Web应用的框架,...

    ruby-2.2.1

    在Ruby-2.2.1中,最重要的更新之一是对浮点数处理的优化。这一版本引入了更快的浮点数运算,使得在处理大量数学计算时,程序运行速度得以提升。此外,还对垃圾回收机制进行了优化,提高了内存管理效率,降低了内存...

    Ruby - Ruby for Rails

    - **枚举器**:讲解如何使用枚举器(enumerator)来迭代处理集合中的元素。 以上内容覆盖了 Ruby 和 Rails 的基础知识、核心概念和高级特性,对于初学者来说是非常宝贵的资源,能够帮助他们快速掌握这两种技术并...

    enumerator_generate:Enumerator#generate Ruby核心提案演示

    这是 Ruby语言核心建议的替代方法。 目标是相同的:生成枚举器,这些枚举器可以惯用地替换(大部分) while和loop周期。 经过一些实验,结果证明“从初始值开始,然后继续该块”(就像Object#enumerate一样)并不...

    Programming Ruby 1.9 & 2.0 The Pragmatic Programmers’ Guide 4th Edition

    Ruby是一种快速发展的激动人心的动态语言,本书是Ruby 1.9和Ruby 2.0这两个最新版本的完整参考指南。Ruby是一种完全面向对象的语言,类似于经典的面向对象语言Smalltalk。与Smalltalk一样,它是动态类型的,但与...

    Ruby程序设计.rar

    5. **元编程**:Ruby的强大之处在于它的元编程能力,允许在运行时修改代码,如定义方法、修改类或模块等。 6. **标准库和Gem**:Ruby的标准库提供了大量内置工具和模块,此外,Ruby的生态系统中还有无数的开源Gem,...

    ruby-1.9.3-preview1.zip

    9. **元编程能力增强**:Ruby 的元编程能力是其独特魅力之一,1.9.3 继续强化了这一点,使代码更加灵活和动态。 1. **语法修正和兼容性**:1.9.3 对一些语法进行了修正,并提高了与早期版本的兼容性。 预览版...

    EnumeratorKit, 在 Objective C 中,ruby 样式枚举.zip

    EnumeratorKit, 在 Objective C 中,ruby 样式枚举 EnumeratorKit - objective-c 中的ruby样式枚举 EnumeratorKit是一个集合枚举库,在 ruby 模块和 Enumerator 类的Enumerable 之后建模。它允许你用一个非常 comp

    rubyinstaller-1.9.3-p385

    Ruby是一种面向对象的、动态类型的编程语言,由Yukihiro "Matz" Matsumoto在1995年创建。...通过RubyInstaller,用户可以轻松地将这个版本的Ruby安装到自己的系统中,从而开启高效、有趣的编程之旅。

    ruby基础教程(第四版)第14章 字符串类1

    Ruby中的字符串还与数组共享一些方法,比如 `each_line`、`each_byte` 和 `each_char`,它们都可以返回 `Enumerator` 对象。`Enumerator` 模块提供了一套灵活的方法,使得可以在不提供块的情况下对这些方法进行后续...

    j-enum:Enumerable 和 Enumerator 的实现

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

    ruby-style-guide:社区驱动的Ruby编码风格指南

    - 枚举类可以使用`Enumerator`或`enum_for`方法创建,便于迭代。 7. **字符串与符号**: - 使用双引号`"`创建字符串,单引号`'`创建符号化字符串。 - 当可能时,利用字符串连接操作符`+`替代 `%` 模板语法,提高...

    ruby-docs:Ruby 2.0.0p481 文档 http

    在标准库方面,Ruby 2.0 增加了 `Enumerator::Yielder`,使得自定义迭代器更加简洁。`Enumerator` 类也得到了改进,可以用于构建更复杂的迭代逻辑。此外,`Thread` 类的线程同步机制得到增强,如 `Mutex` 和 `...

    ruby

    Ruby是一种面向对象的、动态类型的编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年设计并开发。它的设计理念是让编程更加简单、优雅,同时提供...其简洁的语法和强大的特性使得Ruby成为开发者钟爱的语言之一。

    enumerator-parallel:Enumerator 和 Parallel 之间的超级简单包装器

    枚举器::并行 require 'enumerator-parallel'[ 1 , 2 , 3 ] . par ( processes : 3 ) . each { | n | sleep 1 ; p n } 3倍的父亲! 哇哇哇enumerator-parallel保持结果的顺序 (^o^) [ 1 , 2 , 3 ] . par ( threads :...

    ruby-pipeline

    Ruby的`Enumerator::Lazy`类允许我们在处理大量数据时延迟计算,类似于Unix管道的按需处理。它适用于处理无限序列或大数据集,防止一次性加载所有数据到内存: ```ruby infinite_stream = 1.step lazy_squared = ...

    Ruby 迭代器知识汇总

    Ruby的`each`迭代器是最常用的迭代器之一。它允许我们遍历数组或哈希的所有元素,并对每个元素执行指定的代码块。`each`迭代器的语法如下: ```ruby collection.each do |variable| code end ``` 在这个语法结构...

    path_generator:用于从结构生成深度优先路径的微型宝石

    它返回一个Enumerator因此您可以调用 Ruby Enumerator类任何方法。 安装 将此行添加到应用程序的 Gemfile 中: gem 'path_generator' 然后执行: $ bundle 或者自己安装: $ gem install path_generator 用法...

    Codewars-Ruby:我对Codewars的Kata的解决方案

    Ruby的枚举器类如`Enumerator`和`Enumerable`提供了迭代数据结构的方法。在解决Kata时,熟练使用这些迭代器可以使代码更简洁。 8. **元编程** Ruby允许在运行时动态修改类和对象,这是其元编程能力的体现。虽然...

    Text-analyzer:这是Ruby文本分析器

    5. **性能优化**:分析器可能采用了某些技巧来提高处理大量文本时的速度,如使用`Enumerator`或`lazy`特性。 总的来说,Text-analyzer是一个实用的Ruby工具,它展示了如何利用语言特性进行文本分析。通过深入学习和...

Global site tag (gtag.js) - Google Analytics