一周学会Ruby之第三天(控制流程语句介绍)

上一篇 / 下一篇  2009-05-21 09:06:19 / 天气: 晴朗 / 心情: 平静 / 精华(1) / 置顶(1) / 个人分类:Ruby

Ruby是一种功能强大的面向对象的脚本语言,使用Ruby可以方便快捷地进行面向对象程序设计。在本章中,主要介绍Ruby脚本语言的一些基本语法基础,比如常量和变量、数据类型、运算符和表达式、和流程控制语句等等。

常量:

常量,一种恒定的或者不可变的数值或者数据项。在某些时候,虽然声明了一个变量,但却不希望这个数值被修改,这种永不会被修改的变量,统称为常量。声明常量时,Ruby语言要求常量以大写字母(A~Z)开头。

常量的有效范围就是定义常量的类或者模块的内部。因此,定义在该类或者模块里的方法、内部类和内部模块都可以访问到该常量,还可以在该类的子类中访问该常量。当然,可以直接在Ruby源文件中定义顶层常量,顶层常量可以在任意地方引用它,这是因为定义的任何类、模块和方法都位于顶层对象的内部。

变量:

变量(Variable)是指用于容纳一个值在内存中的一块专属的存储位置。用户必须为每一个变量指定一个惟一的名称,使用这个惟一的名称访问这个变量中存储的值。在Ruby中,根据变量的范围,变量可以分为局部变量和全局变量。

数据类型:

数据类型是编程语言中对数据进行描述的定义,因为对于机器不能识别数据,而不同数据间的相互运算在机器内部的执行方式并不一样,需要用户先定义数据的特性再进行其他操作,这里的特性就是数据类型。

流程控制语句:

l if语句

if语句用于判断条件是否为true或者false,并且根据计算结果选择要执行的操作。通常情况下,判断条件是用比较运算符对数值或者变量进行比较运算的表达式。if语句基本语法形式如下所示:

if表达式[then]

   代码片段1

[elsif表达式[then]

   代码片段2]

[else

   代码片段3]

End

l unless语句

unless语句与if语句作用正好相反,当条件表达式返回结果为假时,计算then关键字后面的代码片段。与if语句不同,unless语句中不能使用elsif语句,因此不能处理多分支的程序流程。

unless语句的语法格式如下所示:

unless表达式[then]

   代码片段1

[else

   代码片段2]

end

l case语句

case语句提供了if语句的一个变通形式,可以从多个语句块中选择其中的一个执行。scase语句提供的功能与if语句类似,但是可以使代码更加简练易读。

case语句的基本语法形式如下所示:

case [表达式]

[when常量1 [,常量2]…[,常量3] then

  代码片段1

]

[when常量4 [,常量5]…[,常量6] then

  代码片段2

]

[else

  代码片段3]

end

case语句中,将case关键字后表达式的值依次与when后的多个常量进行比较,一旦相等,则执行对应when语句块中的代码片段。

l while语句

while语句属于基本循环语句,用于在指定条件为真时重复执行一组语句。while语句的语法如下所示:

while条件表达式[do]

    //执行的语句块

End

while语句中,do关键字可以省略,但是为了提高程序的可读性,建议保留do关键字。

l until语句

until语句与while语句作用正好相反,当条件表达式返回结果为假时执行循环体,直到条件表达式为true为止。

until语句的语法格式如下所示:

until条件表达式[do]

    //执行的语句块

end

until语句实现的功能与while语句相同,但是实现方式与while则完全相反。

l for…in语句

Ruby提供的for…in循环语句其实就是一种for each循环,与其他编程语言中的for循环语句有一定的差距,主要用于迭代数组和hash对象中的元素。

使用for…in语句的语法格式如下所示:

for ele in Array|Hash [do]

 循环代码

End

l loop语句

Ruby还提供了一个内建的最基本迭代器:loop。通过loop语句可以执行循环功能,当使用loop语句进行循环时,对指定的代码执行无限次循环,除非显示使用break语句跳出循环。

loop语句的语法格式如下所示:

loop{

#循环体

}

也可以使用如下语法格式:

loop do

#循环体

End

l 迭代器

Ruby语言中为迭代输出容器元素提供了一种简单的方法:迭代器。迭代器用于将数组、Hash对象和普通对象的变量进行迭代输出。

实际上几乎所有的面向对象语言都包含了一定的迭代器机制。当然,有些语言为迭代机制提供了一种特殊的类(例如Java提供了IteratorEnumeration类),Ruby则允许直接为任意对象定义自己的迭代器。

l 使用break结束循环

在前面介绍loop语句时,已经多次使用break关键字来实现结束循环的功能。在while或者until等循环语句中,只要Ruby解释器运行到break语句,Ruby将完全跳出该循环

l 使用next结束本次循环

next语句与break语句的功能有点相似,都用于结束循环。与break语句的区别在于:next语句并不是中断循环语句,而是终止当前迭代的循环,进入下一次循环。简单的讲,next语句是忽略循环语句的当次循环。

l 使用redo重新开始循环

redo语句与next语句的功能相似,都是结束本次循环,开始下次循环。但是与next语句不同的是:next语句开始下次循环时,先检查循环条件是否成立,只有当循环条件成立时,才会开始下次循环;redo却不再检查循环条件,直接开始下次循环。

l 使用retry重启迭代器

在迭代、块或者for…in语句中,使用retry语句可以开始全新的迭代,因此,迭代器的参数也被重新初始化。

下面在for…in语句中使用retry语句,当满足某一个条件时,重新遍历变量数组元素:

citys=["北京","上海","天津","重庆"]                                                  #定义数组

flag=true                                                                                                 #定义布尔变量

for city in citys do                                                                                  #使用for…in语句

 puts city                                                                                              #输出数组元素

 if city=="上海"&&flag then                                                              #设置判断条件

   flag=false                                                                                       #更新布尔变量值

   retry                                                                                                #重启迭代器

 end

end

执行结果如下所示:

北京

上海

北京

上海

天津

重庆

l 使用return结束循环

除了break语句和next语句外,return语句也可以用来终止循环。但是return语句并不是专门用于控制循环的语句,其主要作用是结束一个方法,并返回方法的返回值。

所以使用return语句终止循环只能在方法体内使用。如果在方法体的循环结构中使用了return语句,不管当前循环有多少重嵌套,都会被终止,同时结束函数的运行。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

关于作者