技术开发 频道

二十分钟 教你Ruby快速入门


向每个人问候,MegaGreeter不会漏掉一个人

Greeter并不完美,因为它只能一次服务一个人。所以我们在这里设计一个能够一次向全世界、世界上每个人或者在名单中的人发送问候的MegaGreeter类。在这里,我们将放弃从前的IRB交互模式,转而改为编写Ruby程序文件。

退出IRB的方法:输入“quit”、“exit”或者按下Control+D的组合键。



保存上面的代码到名为“ri20min.rb”的文件中,并使用“ruby ri20min.rb”的命令执行它。程序输出如下:



下面我们将深入了解一下上面的代码。

请注意上面代码中的起始行,它以#开头。在Ruby语言中,任何以#开头的行都被视为注释,并被解释程序忽略。

我们的say_hi方法已经发生了变化:



它查找@names参数并按照其参数值作出决定:

如果参数值为nil,它将打印三个圆点。

那么@names.respond_to?("each")表示什么?

循环——也叫迭代

如果@names对象具有each方法,那么它是可以被迭代的,进而可以对其进行迭代,从而问候列表中每个人。如果@names不具备each方法,则将它自动转换为字符串,并执行默认的问候。



each是一种方法,它接受一个代码块(block of code),然后针对列表中的每个成员执行这个代码块,而在do和end之间的部分便是这个非常类似匿名函数的代码块。在管道符之间的变量是代码块的参数name,它作为代码块参数被绑定为列表成员,而代码块puts "Hello #{name}!"将使用这个参数进行输出。

大多数其它的编程语言使用循环遍历列表,下面是C语言的循环示例:



上面的代码显然可以工作,但它不够“优雅”!你不得不用i这个多余的循环变量,还需要指出列表的长度,然后再解释如何遍历列表。

Ruby的迭代方式则更加优雅,所有的内部管理细节都隐藏在each方法中,你所需做的就是告诉它如何处理其中的每个成员。

0
相关文章