2.4. 核心语言——控制流

未匹配的标注

这一节主要是讲控制程序流的各种关键字

if 和 unless 关键字

ifunless 关键字用来定义条件块。它们紧接着是一个条件表达式,它不需要用括号来包含。然后是一串指令,然后是关键字 end。如果条件为真,那么 if 后的这些指令就被执行。如果条件为假, 那么 unless 后的指令就被执行。

if 1 < 2
  puts "correct!"
  puts "one is less than two"
end
unless 3 > 4
  puts "something seems to be wrong"
end

else 关键字

关键字 else 用来定义当条件为假时才执行的指令。

if 1 > 2
  puts "that's not how maths works"
else
  puts "one is not greater than two"
end

elsif 关键字

如果有多个条件需要检查的话,这个时候就使用 elsif 来引入除了第一个条件的其他条件,这些条件应该依次判断。第一个为真的条件将会执行它后面的指令。一旦有一个指令被执行之后,后面的条件就不会再被判断了。

if 1 > 2
  puts "this should not execute"
elsif 3 > 4
  puts "neither should this"
else
  puts "this _will_ be printed"
end

单句条件指令

一个条件可以被放到指令的后面来形成单句条件指令。

puts "your computer is broken" unless 1 + 1 == 2

上面这句话等价于一个 unless 语句:

unless 1 + 1 == 2
    puts "your computer is broken"
end

三元表达式

ruby 还支持三元表达式 ?: 基于条件来二选一。一般的模式是 x?y:z 这里的 xyz 都是表达式,如果 x 为真,那么整个表达式的值就是 y,反之就是 z。

没有被选择的表达式是不会被执行。有时候为了清晰会把条件括起来,但是并不是必须。

message = (1 + 1 == 2) ? "working" : "broken"
puts message

case 和 when 关键字

一个更复杂的条件执行的形式是用 case 关键字,它后面跟的是一个条件表达式 x ,比较这个表达式的值和随后一系列 when 字句的值。

如果匹配,那么 when 子句中从值开始直到下一个 when 子句 或是 else 的所有指令全被执行。

一旦执行了一个子句之后的指令,其他的子句就不再被尝试。如果没有 when 的子句匹配,那么这个时候就会到可选的 else 这个部分来执行。不像在类 C 语言中的 switch case 的结构,when 子句不会执行下一个块。

x = <whatever>
case x
when 1
  puts "one"
when 2
  puts "two"
else
  puts "many"
end

case 和 then 关键字

如果一个子句块是一条单一的指令。那么它可以和 when 放到一排上面,以 then 这个关键字作为前缀。

case x = <whatever>
when 1 then puts "one"
when 2 then puts "two"
else puts "many"
end

一个 when 还可以跟着多个值。当 case 后面的表达式 x 匹配它们其中任何一个值时,then 后面的指令都会被执行。

case x = <whatever>
when 1, 3 then puts "odd"
when 2, 4 then puts "even"
end

case 的 模式匹配

case 不仅可以按精确值来比较—— 全等(==),它还可以使用一个 distinct operator 也叫做 case equity 写成三个等号(===)。大体意思是说这个值它匹配一个模式或者是一组当中的一个成员。比如如果一个 when 后面跟着一个类名,这个时候假如 case 后表达式 x 是该类的一个实例的话,那么这个 when 子句 就匹配上了。

case x = "1"
when Integer then puts "it's a number"
when String then puts "it's a string"
end

除了 integer 和 string 外,其他常用的还有 regular expression 和 numeric ranges。

while 和 until 关键字

while 和 until 这个关键是用作迭代的,while会重复检查它的条件,当它为真的时候,执行随后的指令。until 就是当条件为假的时候,它才会执行。

x = 0
while x < 10
  puts x = x + 1
end

就像 if 和 unless 一样, 为了在一个循环中执行一个单句指令,while 和 until 都能够被放到那个指令后面。

x = 0
puts x = x + 1 until x == 10

loop 关键字

还有非条件的循环结构 loop 它里面包括了一个块然后一直执行,直到一个遇到 break, return 或者 raise 这种关键字才可以跳出来。

loop do
  puts "are we there yet?"
end

在 loop 里面 遇到 next 这个关键字就会直接跳到下一次迭代,break 会从这个 loop 里面整个地去跳出来。 Ruby 没有像在类 C 语言里面可以看到的 loop label。所以说 next 和 break 只影响直接包围的这个循环。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~