在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)
分享到:
相关推荐
ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码
ruby源代码 ruby源代码 ruby源代码 ruby源代码4
ruby源代码 ruby源代码 ruby源代码 ruby源代码2
ruby源代码 ruby源代码 ruby源代码 ruby源代码3
在Ruby中一个代码块block不是对象,但可以用Proc来替代其作为对象进行操作,接下来我们就来详解Ruby中的代码块对象Proc
ruby源代码 ruby源代码 ruby源代码 ruby源代码5
block代码块基本上是开始学习Ruby后的第一个坎,接下来就带大家详解Ruby中的代码块及其参数传递,需要的朋友可以参考下
ruby测试代码6
在Ruby中,block并不是类,block可以被转化为Proc类中衍生出的对象,刚接触Ruby的话block是很难理解的一个点,接下来就为大家来总结Ruby中的block代码块学习教程
ruby on rails项目开发
Ruby以其易读易写的语法、强大的面向对象编程和丰富的生态系统而备受开发人员的喜爱。本文将为您介绍Ruby的特点、优势、应用领域以及如何使用Ruby进行开发。 一、Ruby的特点与优势 1. 简洁而优雅:Ruby的设计哲学是...
ruby测试代码1
听到代码块这个翻译,你或许会联想到类或者结构体,但block并不是这些东西,这里就带着大家来深入理解Ruby中的代码块block特性
ruby-debug-base19-0.11.26.gem
ruby测试代码7
Reek - Ruby代码味道探测器
《Ruby程序设计语言》是Ruby的权威指南,全面涵盖该语言的1.8版和1.9版。本书详尽但并不拘泥于语言规范,既适合首次接触Ruby的资深程序员,同样也适合那些想要挑战对这门语言的理解并更深入掌握它的Ruby程序员。本书...
ruby源代码6ruby源代码6ruby源代码6ruby源代码6
ruby源代码7ruby源代码6ruby源代码6ruby源代码7