`
simohayha
  • 浏览: 1400014 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

ruby1.9中的Iterators

    博客分类:
  • ruby
阅读更多
在ruby1.9中增加了External Iterators这中新的迭代类型,所有的Enumerable 都是External Iterators.而在ruby1.9之前的版本中的迭代都是internal iterator。

何为external iterator呢,其实我认为也就是一个生成器了:

iterator = 9.downto(1)             # An enumerator as external iterator
begin                              # So we can use rescue below
  print iterator.next while true   # Call the next method repeatedly
rescue StopIteration               # When there are no more values
  puts "...blastoff!"              # An expected, nonexceptional condition
end




这里的Kernel.loop方法就是为了迭代External Iterators而专门创建的。当next方法到最后一个元素的时候,就会抛出StopIteration,因此这里我们捕捉这个异常来判断迭代是否结束.

任何External Iterators都可以调用rewind 方法来重启这个迭代器。要注意如果一个enumerator 基于像File这样的对象,那么调用rewind将不会起作用。

一旦一个External Iterators开始迭代,那么他就不能被clone和duplicated。

我们可以简单的使用External Iterators来创建一个each方法,也就是通过External Iterator来创建一个internal iterator:

module Iterable
  include Enumerable          # Define iterators on top of each
  def each                    # And define each on top of next
    loop { yield self.next }
  end
end


下面我们可以这样做:

def iterate(iterator)
  loop { yield iterator.next }
end

iterate(9.downto(1)) {|x| print x }



下面是三个函数,功能都是一样的,第一个使用internal iterators,第二个虽然使用了External iterators ,可是没有用loop方法,因此代码很丑陋,第三个方法是最好的方法。:

# Call the each method of each collection in turn.
# This is not a parallel iteration and does not require enumerators.
def sequence(*enumerables, &block)
  enumerables.each do |enumerable|
    enumerable.each(&block)
  end
end

# Iterate the specified collections, interleaving their elements.
# This can't be done efficiently without external iterators.
# Note the use of the uncommon else clause in begin/rescue.
def interleave(*enumerables)
  # Convert enumerable collections to an array of enumerators.
  enumerators = enumerables.map {|e| e.to_enum }
  # Loop until we don't have any more enumerators.
  until enumerators.empty?
    begin
      e = enumerators.shift   # Take the first enumerator
      yield e.next            # Get its next and pass to the block
    rescue StopIteration      # If no more elements, do nothing
    else                      # If no exception occurred
      enumerators << e        # Put the enumerator back
    end
  end
end

# Iterate the specified collections, yielding tuples of values,
# one value from each of the collections. See also Enumerable.zip.
def bundle(*enumerables)
  enumerators = enumerables.map {|e| e.to_enum }
  loop { yield enumerators.map {|e| e.next} }
end

# Examples of how these iterator methods work
a,b,c = [1,2,3], 4..6, 'a'..'e'
sequence(a,b,c) {|x| print x}   # prints "123456abcde"
interleave(a,b,c) {|x| print x} # prints "14a25b36cde"
bundle(a,b,c) {|x| print x}     # '[1, 4, "a"][2, 5, "b"][3, 6, "c"]'


这里要注意,在ruby1.8中的zip效率很低,那是因为它首先转换参数为数组,然后迭代他,可是在1.9中,由于我们有了External Iterators,因此它的实现就是直接迭代。因此他就更高效.








8
6
分享到:
评论
1 楼 dennis_zane 2008-03-07  
还是内部迭代器看起来比较自然

相关推荐

    元编程 Ruby

    4. 代码块(Blocks)、迭代器(Iterators)和Procs:它们是Ruby中实现控制流和数据处理的核心构造,提供了灵活的代码复用和抽象机制。 5. 动态执行:Ruby中的eval函数允许动态地执行字符串中的代码,这是一种强大的...

    eloquent ruby

    本书在Ruby社区中获得了极高的评价,被认为是一本介绍Ruby语言精髓的优秀读物。 #### 关键知识点概述 1. **Ruby语言简介** - Ruby是一种面向对象、解释型的脚本语言。 - 它由日本的程序员松本行弘(Matz)于1995...

    Ruby-Ruby技巧惯用Ruby重构和最佳实践

    1. 块和迭代器:Ruby中的块(blocks)和迭代器(iterators)是其强大之处。使用`each`、`map`等方法可以简洁地遍历集合。例如,`array.each { |item| puts item }`用于打印数组的所有元素。 2. 魔术方法:Ruby允许...

    Programming Ruby

    - **第8章:Exceptions, Catch, and Throw**:异常处理是任何现代编程语言的重要组成部分,本章详细介绍了Ruby中的异常处理机制。 - **第9章:Modules**:模块(module)在Ruby中用于组织代码和提供命名空间隔离。 - *...

    js-iterators:JS中的Ruby样式迭代器

    js-iterators(零依赖) JS中的Ruby样式迭代器。 JS中的Ruby样式范围[ ... 1. . _10 ] ; // [1, 2, 3, 4, 5, 6, 7, 8, 9][ ... 1. . _ - 10 ] ; // [1, 0, -1, -2, ..., -9][ ... Math . PI . _9 ] ; // [3....

    从零到英雄:一步步部署你的Ruby on Rails应用

    4. **闭包和迭代器**:Ruby 支持闭包(blocks)和迭代器(iterators),使得循环和迭代操作更加灵活。 5. **Mixin模块**:Ruby 允许使用 mixin 模块来为类添加方法,而不需要使用传统的继承。 6. **元编程**:Ruby ...

    deeplearning4j-datavec-iterators-1.0.0-M1.1-API文档-中文版.zip

    赠送jar包:deeplearning4j-datavec-iterators-1.0.0-M1.1.jar; 赠送原API文档:deeplearning4j-datavec-iterators-1.0.0-M1.1-javadoc.jar; 赠送源代码:deeplearning4j-datavec-iterators-1.0.0-M1.1-sources....

    deeplearning4j-utility-iterators-1.0.0-M1.1-API文档-中文版.zip

    赠送jar包:deeplearning4j-utility-iterators-1.0.0-M1.1.jar; 赠送原API文档:deeplearning4j-utility-iterators-1.0.0-M1.1-javadoc.jar; 赠送源代码:deeplearning4j-utility-iterators-1.0.0-M1.1-sources....

    deeplearning4j-datavec-iterators-1.0.0-M1.1-API文档-中英对照版.zip

    赠送jar包:deeplearning4j-datavec-iterators-1.0.0-M1.1.jar; 赠送原API文档:deeplearning4j-datavec-iterators-1.0.0-M1.1-javadoc.jar; 赠送源代码:deeplearning4j-datavec-iterators-1.0.0-M1.1-sources....

    deeplearning4j-utility-iterators-1.0.0-M1.1-API文档-中英对照版.zip

    赠送jar包:deeplearning4j-utility-iterators-1.0.0-M1.1.jar; 赠送原API文档:deeplearning4j-utility-iterators-1.0.0-M1.1-javadoc.jar; 赠送源代码:deeplearning4j-utility-iterators-1.0.0-M1.1-sources....

    泛型指標(Iterators)與Traits 技術.zip

    在C++标准模板库(STL)中,泛型编程的一个核心概念就是迭代器(Iterators)。迭代器是一种设计模式,它扮演着类似指针的角色,但提供了更抽象、更通用的访问容器内元素的方式。侯捷是C++领域的知名专家,他深入探讨...

    12-iterators-and-generators(迭代器和生成器12).pdf

    迭代器和生成器是JavaScript(包括TypeScript)中的核心特性,它们在处理数据序列和优化内存使用方面扮演着重要角色。在TypeScript 2.1及更高版本中,对这两种概念的支持更加完善。 **可迭代性** 一个对象被称为可...

    deeplearning4j-datavec-iterators-1.0.0-M1.1.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...

    Java Methods-Lists and Iterators.ppt

    在 Java 语言中,列表(Lists)和迭代器(Iterators)是两个非常重要的概念。列表是一种数据结构,它可以存储多个元素,而迭代器则是用来遍历列表元素的对象。在本文中,我们将详细介绍列表和迭代器的概念,以及它们...

    ruby:1233

    2. **动态类型**:Ruby中的变量无需预先声明类型,其类型会在运行时根据赋值自动确定,这使得代码更加灵活,但同时也可能导致运行时错误。 3. **元编程**:Ruby允许在运行时修改代码,这使得它非常强大。例如,你...

    ROR books 经典教程 入门 提高

    这里可能存在着一定的理解偏差,因为文件中提供的具体内容更多地是关于 Ruby 语言本身而非 Rails 框架,但考虑到标题和描述中的关键词“经典教程”、“入门”、“提高”,我们可以认为该教程涵盖了 Ruby 语言学习的...

    learn_oop_ruby:启动School Ruby OOP教程

    "learn_oop_ruby:启动School Ruby OOP教程"是一个针对初学者的资源,旨在帮助他们掌握Ruby中的面向对象编程概念。 在Ruby中,一切都是对象。类是创建对象的蓝图,它定义了对象的属性(或称为实例变量)和行为(或...

    Ruby

    Ruby中的类可以自由定义方法,甚至可以为已有类添加方法,这是通过 reopen 类来实现的。 ### 2. 动态性 Ruby的动态性体现在许多方面:类型检查是在运行时进行的,这意味着可以在程序运行过程中改变变量的类型;...

    deeplearning4j-utility-iterators-1.0.0-M1.1.jar中文-英文对照文档.zip

    注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...

Global site tag (gtag.js) - Google Analytics