`
superxielei
  • 浏览: 267217 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

Ruby中的迭代器实现。

    博客分类:
  • ROR
阅读更多
记得刚接触ruby的时候被可爱的each深深吸引,也有让人看不懂的
show("Ruby") |value| do puts "value is " + value end

深入了解以后终于发现了其中的秘密,今天有空整理出来。

其实这些都是ruby中的“块”所实现的。
块可以看成是由代码组合成的变量(是不是有点像函数?),我们可以在调用方法的传递一个块做参数,而方法内调用这个块就实现了上边的两种应用。

定义块可以使用
{
  ....
}

或者
do 
  ....
end


然后在方法中使用yield调用就可以啦。

来个小例子,先来看看定义的方法
def show
  yield
end

够简单吧,只有已经yield,有了他我们就可以传递一个块做参数给show方法,show方法就是调用执行我们传递的块。
show do
  puts "我们定义的块" 
end

运行来看看。没有意外屏幕就应该显示  "我们定义的块"
如果看不明白可以这样看看
show (do puts "我们定义的块" end)
#就是个参数,不过参数是个使用块语法定义的块。不过要注意可不能这么写,不能执行的~呵呵!真的想写一行就去掉括号吧。
show do puts "我们定义的块" end

基本的块的应用就是这么简单,来点深的,加上点参数。
还是来看看方法
def show name
  yield name
end

多了一个参数而已,没难度。下面传递块。
show "SuperXieLei" do |value|
  puts "我的名字是:"  + value
end

太简单了。还可以传递多个参数。不写了,和其他的方法差不多。参数不足的时候就是nil,参数多了就是数组。

灵活的使用块可以很方便的让我们编写代码。下边这个是由一本书上改编而来的,书名就不说了避免广告嫌疑。
class Apple
  def initialize name,color,weight,&action
    @name = name
    @color = color
    @weight = weight
    @action = action
  end

  def show
    @action ? ( @action.call :name,@name) : (yield :name,@name)
    @action ? ( @action.call :color,@color) : (yield :color,@color)
    @action ? ( @action.call :weight,@weight) : (yield :weight,@weight)
  end
end

apple = Apple.new "红苹果","红色","0.4" do |name,value|
  puts "使用原始块执行--" + name.to_s + "变量值是:" + value.to_s
end
apple.show do |name,value| 
  puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end

apple1 = Apple.new "绿苹果","绿色","0.8"
apple1.show do |name,value| 
  puts "使用新定义块执行--" + name.to_s + "变量值是:" + value.to_s
end
分享到:
评论

相关推荐

    js 数组实现一个类似ruby的迭代器

    ·基本实现 ·在迭代中引用原来的对象,或者直接改变数组的值而不是返回一个新数组 ·向迭代传入无限多的参数 ·基本实现 今天突然发现js的数组处理起来真是麻烦,代码一些就是一大堆,相比起ruby的迭代器来真是逊色...

    Ruby中Block和迭代器的使用讲解

    在Ruby中,迭代器通常通过向集合对象发送消息来实现。例如,使用`each`方法遍历数组: ```ruby animals = %w(ant bee cat dog elk) animals.each do |animal| puts animal end ``` 输出结果为: ``` ant bee cat...

    Ruby迭代器的7种技巧分享

    二、依次打印1..9,在ruby中的方法就更多了,这里用比较简单的方式来实现,如下: 代码如下: (1..9).each{|i| print i,” “} 三、打印1..9中比7要小的数值,如下: 代码如下: 1.upto(9){|i| print i,” ” if i &...

    Ruby 迭代器知识汇总

    在Ruby中,迭代器是非常常见且强大的概念,尤其是对于处理数组和哈希等集合类型的数据结构。 Ruby的`each`迭代器是最常用的迭代器之一。它允许我们遍历数组或哈希的所有元素,并对每个元素执行指定的代码块。`each`...

    简要说明Ruby中的迭代器

    在Ruby中,迭代器通常是通过块(block)来实现的,这是一种匿名函数的形式。 首先,我们来看`each`迭代器。`each`是最常用的迭代器之一,用于遍历数组或散列的所有元素。它的基本语法是: ```ruby collection.each...

    Ruby-Ruby中的GoF设计模式实现

    Ruby的`Enumerable`模块提供了迭代器模式,如`each`方法。 17. **状态模式**:允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。Ruby中,可以使用模块或类的继承来实现状态的变化。 18. ...

    ruby 中文文档 必备资料

    块(block)和 Proc 对象是Ruby的独特之处,它们可以用来实现迭代和回调功能。 Ruby的元编程能力非常强大,可以动态修改类和对象的行为。反射API(Reflection API)允许在运行时检查和操作对象、类和模块的内部结构...

    Ruby语言中文教程.rar

    块可以与方法配合,实现迭代器等功能,例如`each`方法遍历数组或集合。 异常处理在Ruby中通过`begin..rescue..end`结构完成,可以捕获并处理程序运行时可能出现的错误。Ruby还提供了丰富的内建模块,如`Math`模块...

    Ruby元编程第二版中文

    它们是元编程中常见的一部分,尤其是在迭代器和回调函数中。 7. **Ruby的鸭子类型**:Ruby强调“鸭子若能走路并嘎嘎叫,那它就是鸭子”,这意味着类型检查通常在运行时进行,这为元编程提供了便利。 通过学习...

    一些图形算法的Ruby实现_Ruby_下载.zip

    - 学习如何利用Ruby的迭代器和函数式编程特性来简化代码和提高可读性。 这个Ruby实现的图形算法集合可以帮助初学者和经验丰富的开发者加深对图形算法的理解,并提供实践经验,以便在实际项目中应用。通过实践和...

    Ruby中文参考手册

    9. **块和迭代器**:Ruby中的块(采用do..end或{}语法)和迭代器(如each、map等)是处理集合数据的重要工具。 10. **模块混合**:Ruby的模块可以被类“混入”(include或extend),实现跨类的代码共享。 11. **类...

    ruby准备资料ruby准备资料

    在“ruby准备资料”中,我们可以关注几个关键概念:操作符重载、闭包和迭代器,这些都是Ruby编程中的核心概念。 1. **操作符重载(Operator Overloading)** Ruby允许程序员为自定义类定义操作符的行为,这意味着...

    《Programming Ruby》中文第2版源代碼下載

    同时,Ruby的迭代器和块机制让处理集合变得简单而富有表达力。 《Programming Ruby》还会介绍Ruby的Gem生态系统,这是Ruby社区共享和分发代码的主要方式。源代码可能包含一些常见的Gem,如`nokogiri`(用于解析XML...

    ruby语言帮助文档(简体中文)

    Ruby中的类和模块是构建对象的基础,类用于定义对象的结构和行为,模块则用于组织代码和实现多继承。 3. **方法**:Ruby的方法可以看作是对象的行为,可以定义在类、模块或者对象上。方法调用可以用点操作符(`.`)...

    Ruby基础教程(中文第4版)

    Ruby还支持块(block),这是一种特殊的语法结构,常与迭代器配合使用,使得代码更加简洁。 面向对象编程是Ruby的强项。本书将深入探讨类和对象的概念,以及如何使用继承、封装和多态性来设计和实现复杂的软件结构...

    Ruby编辑器scite F5可以运行

    当你在Scite中编写Ruby代码时,按下F5,编辑器会查找当前打开的文件并尝试执行其中的代码,这对于快速迭代和验证代码逻辑非常有用。 在自动化方面,Scite还允许用户通过配置文件(通常是`scite.properties`)来自...

    ruby中文文档 chm版

    例如,`each`方法就是一种常见的迭代器,可以遍历集合中的每一个元素。 Ruby的元编程能力是其独特之处,它允许在运行时修改代码的行为。这通过反射(reflection)和动态方法定义(method_missing)等机制实现,极大...

Global site tag (gtag.js) - Google Analytics