在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,因此它的实现就是直接迭代。因此他就更高效.
分享到:
相关推荐
4. 代码块(Blocks)、迭代器(Iterators)和Procs:它们是Ruby中实现控制流和数据处理的核心构造,提供了灵活的代码复用和抽象机制。 5. 动态执行:Ruby中的eval函数允许动态地执行字符串中的代码,这是一种强大的...
本书在Ruby社区中获得了极高的评价,被认为是一本介绍Ruby语言精髓的优秀读物。 #### 关键知识点概述 1. **Ruby语言简介** - Ruby是一种面向对象、解释型的脚本语言。 - 它由日本的程序员松本行弘(Matz)于1995...
1. 块和迭代器:Ruby中的块(blocks)和迭代器(iterators)是其强大之处。使用`each`、`map`等方法可以简洁地遍历集合。例如,`array.each { |item| puts item }`用于打印数组的所有元素。 2. 魔术方法:Ruby允许...
- **第8章:Exceptions, Catch, and Throw**:异常处理是任何现代编程语言的重要组成部分,本章详细介绍了Ruby中的异常处理机制。 - **第9章:Modules**:模块(module)在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....
4. **闭包和迭代器**:Ruby 支持闭包(blocks)和迭代器(iterators),使得循环和迭代操作更加灵活。 5. **Mixin模块**:Ruby 允许使用 mixin 模块来为类添加方法,而不需要使用传统的继承。 6. **元编程**:Ruby ...
赠送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....
赠送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....
赠送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....
赠送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....
在C++标准模板库(STL)中,泛型编程的一个核心概念就是迭代器(Iterators)。迭代器是一种设计模式,它扮演着类似指针的角色,但提供了更抽象、更通用的访问容器内元素的方式。侯捷是C++领域的知名专家,他深入探讨...
迭代器和生成器是JavaScript(包括TypeScript)中的核心特性,它们在处理数据序列和优化内存使用方面扮演着重要角色。在TypeScript 2.1及更高版本中,对这两种概念的支持更加完善。 **可迭代性** 一个对象被称为可...
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...
在 Java 语言中,列表(Lists)和迭代器(Iterators)是两个非常重要的概念。列表是一种数据结构,它可以存储多个元素,而迭代器则是用来遍历列表元素的对象。在本文中,我们将详细介绍列表和迭代器的概念,以及它们...
2. **动态类型**:Ruby中的变量无需预先声明类型,其类型会在运行时根据赋值自动确定,这使得代码更加灵活,但同时也可能导致运行时错误。 3. **元编程**:Ruby允许在运行时修改代码,这使得它非常强大。例如,你...
这里可能存在着一定的理解偏差,因为文件中提供的具体内容更多地是关于 Ruby 语言本身而非 Rails 框架,但考虑到标题和描述中的关键词“经典教程”、“入门”、“提高”,我们可以认为该教程涵盖了 Ruby 语言学习的...
"learn_oop_ruby:启动School Ruby OOP教程"是一个针对初学者的资源,旨在帮助他们掌握Ruby中的面向对象编程概念。 在Ruby中,一切都是对象。类是创建对象的蓝图,它定义了对象的属性(或称为实例变量)和行为(或...
Ruby中的类可以自由定义方法,甚至可以为已有类添加方法,这是通过 reopen 类来实现的。 ### 2. 动态性 Ruby的动态性体现在许多方面:类型检查是在运行时进行的,这意味着可以在程序运行过程中改变变量的类型;...
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【*...