Tuesday, October 21, 2008

(1)条件判断语句

这一节要说的是条件控制语句,if, else ,elsif,unless,end。是Ruby中所有的对象都是有值的即使是一个条件判断语句。和大多数语句一样Ruby中条件判断语句用前面提到的关键字实现。比如:
if 条件表达式
要执行的代码
end


如果条件表达式的值为nil和false以外的任何值:if 和end之间的代码都会被执行,条件表达式之后必须换行后再写入要执行的代码,否则的话你需要一个额外的关键字then来分隔出哪部分是条件表达式,哪部分是要执行的代码。
# 如果x小于10 就给它加1
if x < 10 # 通过换行分隔
x += 1
end
if x < 10 then x += 1 end # 通过then关键字分隔

当然,在then关键字之后换行也是允许的:
if x < 10 then
x += 1
end

else关键字用于条件的跳转,如果if的条件不成立那么就执行else 部分的代码。
if data         # 如果data不为空
data << x # 那么在data中增加元素.
else # 否则...
data = [x] # 创建一个新的数组来保存这个元素.
end # 条件判断结束.

elsif关键字相当于else if ,解释一下就是“否则的话,那么如果。。。”
if x == 1
name = "one"
elsif x == 2
name = "two"
elsif x == 3 then name = "three" #elsif后也可以加then关键字
elsif x == 4; name = "four"#可以用分号替带换行
else
name = "many"
end

我们刚才说过Ruby中所有的对象都是有值得包括条件判断语句,条件判断语句返回的值,就是满足条件的代码块最后一行的值:
name = if    x == 1 then "one"
elsif x == 2 then "two"
elsif x == 3 then "three"
elsif x == 4 then "four"
else "many"
end
刚才我们提到,if表达式必须以换行或者then 加end的方式出现,Ruby中还提供了另外一个变体,你可以把要执行的代码放在if前面,条件表达式放在if的后面,then和end都可以不写,不过这种写法要求整个语句只能位于一行中:
puts message if message    # Output message, if it is defined

除了if语句Ruby还提供了一个unless语句,它的结构和if语句相似,但是执行与if语句相反的判断操作,也就是说如果unless后的表达式为false或nil那么就执行其后的代码:
s = unless o.nil?                        # 换行分隔
o.to_s
end
s = unless o.nil? then o.to_s end # then 关键字分隔

不过,unless没有类似elsif这样的语句。
最后在来提提Ruby中的case语句,如果你是Java程序员,你一定用过switch语句,他们的功能是类似的,不过case语句更强的,因为基于case语句的条件表达式可以是任何对象类型。
case
when x == 1
"one"
when x == 2
"two"
when x == 3
"three"
end

你也可以在when 后的条件表达式 后加then关键字来省去换行。或者更简洁的写法(如果你只判断一个变量的值):
name = case x
when 1 # 只比较x的值
"one"
when 2 then "two" # then关键字替代了换行
when 3; "three" # 分号替代了换行
else "many" # else用于提供缺省值
end

case语句中还可以包含多个条件表达式,表示满足其中任何一个条件都可以执行其后的代码:
case
when x == 1, y == 0 then "x is one or y is zero" # 用逗号分隔多个条件
when x == 2 || y == 1 then "x is two or y is one" # ||看起来更容易理解
end
我们前面讲过===在Range中可以判断一个值是否包含在其中,还可以判断一个对象是否是一个类的实例,在case语句中也可以这样使用:
x=1

case
when Numeric===x
print "yes"
else
print "no"
end

Ruby中同样支持?:的简写方式来完成一个条件判断,其中?相当于then,:相当于else:
def how_many_messages(n) # Handle singular/plural 
"You have " + n.to_s + (n==1 ? " message." : " messages.")
end

No comments: