`

Ruby入门之代码块、迭代子和过程对象

阅读更多
在Ruby的一切都是一个对象。甚至一个代码块也是一个对象!在Ruby中,代码对象被称为代码块。你可以把代码块想像成小的程序单元。它们包含Ruby代码并且能够在执行它们时转入到方法中。在Python,C和Java中与之类似的概念是函数指针,匿名函数,内部类和回调函数。

  Ruby代码块的语法是,把Ruby代码放在大括号之间或放在do/end命令之间。如下所示:



{
#这是一个代码块...
}
do
#...并且这也是一个代码块
end

  在一个很简单的实例中,{puts"hello world"}就是一个有效的代码块。那么,你应该如何使用这些代码块并且把它们作为一组代码传递给一个方法呢?为此,首先要定义一个如下形式的简单方法:

def someMethod
yield
end

  命令yield把控制传递给代码块(它被传递给这个方法)。下面的代码向你展示,一个代码块是如何被传递到上面这个方法的。

irb(main):001:0> someMethod {puts "hello world"}
hello world

  每当调用yield时,执行传递到该方法的代码块。下面是另一个更复杂些的方法的例子,它使用了一个代码块来做更多的工作。

irb(main):001:0>
def fibonacci (stop)
while stop < 20
stop=yield
end
end
=> nil
irb(main):006:0>
i=0; j=1; fibonacci(j) {puts i; temp = i; i = j;j = temp + j}
0
1
1
2
3
5
8

  代码块被应用于整个Ruby中。最重要的是,代码块被Ruby内部地应用于象Array,Hash,甚至String这样一些类的iterator方法中。一个代码块其实就是,你定义要执行什么任务(典型地,是针对一个元素的任务)。为了进一步说明代码块和iterator的使用,我们提供了一个小例子。假定你定义了一些场院动物类(如图3所示),还有一个这些动物的数组,你可以通过在这个数组上使用一个代码块和一个迭代子来实现让每一种动物发声。


图3.简单的场院动物类

irb(main):031:0>
barnYard = [Cow.new, Duck.new, Chicken.new, Horse.new, Dog.new]
=> [#<Cow:0x58d2f48>, #<Duck:0x58d2f30>, #<Chicken:0x58d2f00>, #<Horse:0x58d2ee8>, #<Dog:0x58d2ed0>]
irb(main):032:0>
barnYard.each {|animal| animal.talk}
Mooooo
Quack
Cluck-cluck
Naaaay
Bark bark

  在barnYard上调用的每个方法正是一个数组上的iterator方法之一。注意,|符号用于定义要接收的参考。在本例情况中,代码块接收一个参数;也就是把barnYard中的每一种动物作为迭代子来遍历这个动物集合。

  迭代子和代码块甚至允许我们完成如下一些相当简单和整洁的事情:

irb(main):001:0>
3.times {puts "Ruby is cool!"}
Ruby is cool!
Ruby is cool!
Ruby is cool!

  是的,即使是Integer类也提供了一个迭代子(times方法)-它使用一个代码块来快速地执行循环操作。

  在离开有关代码块和迭代子的讨论前,你还应该知道代码块可以被赋值给一个变量。事实上,这样的代码块实际上是Proc类的实例。你可以使用new方法来定义一个Proc实例,或者使用这些Proc实例-这些实例稍后可以使用call方法来调用。

irb(main):003:0> simpleProc.call
hello
=> nil
irb(main):004:0> anotherProc.call("hello yourself")
hello yourself
=> nil

  这允许一个可重用的代码块可以被包装为一个对象(它可以在任何地方执行)而进行传递。下面是显示Ruby中可重用代码的示例!

irb(main):001:0>
def simpleMethod(aProc)
puts "Is Ruby cool or what?"
aProc.call("Way cool dude!")
end
=> nil
irb(main):005:0>
simpleMethod(anotherProc)
2
0
分享到:
评论

相关推荐

    Ruby入门教程中文PDF 附实例

    总之,无论你是对编程感兴趣的新手,还是想扩展技能树的开发者,这份“Ruby入门教程中文PDF 附实例”都将是你宝贵的参考资料。通过学习,你不仅可以掌握Ruby的基础知识,还能体验到编程的乐趣和效率。

    ruby入门书籍

    3. **块和闭包**:Ruby中的块是代码段,可以与方法一起使用,闭包是能够记住其定义环境的代码块,常用于迭代和函数式编程。 4. **方法和操作符重载**:Ruby允许自定义方法,甚至可以重载操作符,实现自定义的行为。...

    Ruby相关入门教程网址

    3. **块、迭代器和闭包**:Ruby中的块是代码段,可以与方法配合使用,通过`do..end`或`{..}`来定义。块可以转化为Proc对象,实现闭包特性,这在函数式编程中非常有用。 4. **元编程**:Ruby提供了强大的元编程能力...

    Ruby入门培训ppt/pdf及代码

    这个“Ruby入门培训ppt/pdf及代码”资源提供了一个全面的学习路径,帮助初学者快速掌握Ruby的基础知识和实际应用。 Ruby的核心特性包括: 1. **面向对象**:Ruby是最纯粹的面向对象语言之一,几乎一切皆对象,包括...

    Ruby从入门到精通pdf

    - 块:Ruby中的代码块可以用do..end或花括号{}包裹,常用于迭代和控制流。 - 闭包:块可以捕获其定义时的作用域内的变量,形成闭包,这使得Ruby的回调函数和函数式编程特性得以实现。 4. **模块**: - 模块用来...

    二十分钟Ruby入门教程

    Ruby还支持块和迭代器,这使得处理数组和哈希变得更加方便。`each`方法就是一个常见的迭代器,用于遍历数组或哈希的所有元素。例如: ```ruby fruits = ["apple", "banana", "orange"] fruits.each do |fruit| puts...

    ruby入门中文合集

    通过这个“Ruby入门中文合集”,你不仅可以掌握Ruby的基本语法和面向对象编程,还能深入理解其设计理念和最佳实践。随着学习的深入,你将能够运用Ruby解决实际问题,甚至开发出自己的Web应用程序。请确保仔细阅读每...

    ruby语言入门教程(中文版)[PDF]

    此外,Ruby还有块(block)、 Proc 和 Lambda 等特性,它们在处理迭代和函数式编程时非常有用。 面向对象是Ruby的一大特色。所有Ruby对象都是类的实例,每个对象都可以接收消息(方法调用)。Ruby提供了类、模块和...

    Ruby入门教程 pdf文字版

    本教程是为那些想要快速入门Ruby编程的初学者准备的,它以易读性和实用性为特点,旨在帮助你迅速掌握Ruby的基础知识。 1. **Ruby的基本概念** - **变量**:Ruby中的变量分为局部变量、实例变量、类变量和全局变量...

    Ruby基础教程,RUBY入门必备啊~

    Ruby还支持块(Block),这是通过花括号或do...end包裹的一段代码,常与迭代器配合使用,提供了一种简洁的代码组织方式。 Ruby的标准库非常丰富,包含大量内置模块和类,如File、Array、Hash、String等,涵盖了文件...

    Ruby入门教程

    ### Ruby入门教程知识点详解 #### 一、Ruby语言概述 **1.1 Ruby的历史** Ruby是一种面向对象的脚本语言,由日本人松本行弘(Matz)于1995年开始开发。Ruby的设计理念是“使编程人员快乐”,因此它具有简洁、直观...

    RUBY基础入门指南

    #### 五、代码块和迭代器 **5.1 代码块** 代码块是一段可以作为参数传递的代码片段,通常用于控制流结构。 ```ruby (1..5).each do |i| puts i end ``` **5.2 迭代器** 迭代器是一种特殊的代码块,用于遍历...

    Ruby 从入门到精通

    - **闭包和块**:Ruby的块是一段可以被传递和存储的代码,可以与方法一起使用,实现类似函数的功能,闭包则允许块访问外部变量。 3. **面向对象编程(OOP)** - **类与对象**:Ruby中的类用于创建对象,通过`new`...

Global site tag (gtag.js) - Google Analytics