跳到内容

Ruby 编程/语法/控制结构

来自维基教科书,自由的教科书

控制结构

[编辑 | 编辑源代码]

条件分支

[编辑 | 编辑源代码]

Ruby 可以使用条件分支来控制代码的执行。条件分支根据测试表达式的结果来执行代码块,具体取决于测试表达式为真还是假。如果测试表达式计算结果为常量 falsenil,则测试为假;否则为真。请注意,数字 zero 被认为是真,而许多其他编程语言认为它是假。

在许多流行的编程语言中,条件分支是语句。它们可以影响执行的代码,但它们本身不产生值。然而,在 Ruby 中,条件分支是表达式。它们与其他表达式一样计算出值。例如,一个 if 表达式不仅决定子代码块是否执行,而且它本身也会产生一个值。如果未执行任何代码块,则 if 表达式将产生 nil。例如,以下 if 表达式计算结果为 3

 if true
   3
 end

下面解释了 Ruby 的条件分支。

if 表达式

[编辑 | 编辑源代码]

示例

 a = 5
 if a == 4
   a = 7
 end
 print a # prints 5 since the if-block isn't executed

如果使用 then,您也可以将测试表达式和代码块放在同一行

 if a == 4 then a = 7 end
 #or
 if a == 4: a = 7 end
 #Note that the ":" syntax for if one line blocks do not work anymore in ruby 1.9. Ternary statements still work

这等于

 a = 5
 a = 7 if a == 4
 print a # prints 5 since the if-block isn't executed

unless 表达式

[编辑 | 编辑源代码]

unless 表达式与 if 表达式相反,它包含的代码块只有在测试表达式为假时才会执行。

示例

 a = 5
 unless a == 4
   a = 7
 end
 print a # prints 7 since the unless-block is executed

unless 表达式几乎完全等同于否定后的 if 表达式

 if !expression # is equal to using unless expression

不同之处在于 unless 不允许后续的 elsif。并且没有 elsunless

与 if 表达式一样,您也可以写

 a = 5
 a = 7 unless a == 4
 print a # prints 7 since the unless-block is executed

当代码块中执行的代码只有一行时,“单行代码”非常方便。

if-elsif-else 表达式

[编辑 | 编辑源代码]

elsif(注意它是 elsif 而不是 elseif)和 else 代码块通过提供处理其他测试的选项来进一步控制您的脚本。只有当 if 测试为假时才会考虑 elsifelse 代码块。您可以有任意数量的 elsif 代码块,但只能有一个 if 代码块和一个 else 代码块。

语法

 if expression
   ...code block...
 elsif another expression
   ...code block...
 elsif another expression
   ...code block...
 else
   ...code block...
 end

简短 if 表达式(也称为三元运算符)

[编辑 | 编辑源代码]

“简短 if”语句为您提供了一种节省空间的方式来计算表达式并返回值。

格式为

 result = (condition) ? (expression-if-true) : (expression-if-false)

它也被称为三元运算符,建议仅将此语法用于次要任务(如字符串格式化),因为这可能会导致代码可读性差。

 irb(main):037:0> true ? 't' : 'f'
 => "t"
 irb(main):038:0> false ? 't' : 'f'
 => "f"

这在进行字符串连接等操作时非常有用。

示例

 a = 5
 plus_or_minus = '+'
 print "The number #{a}#{plus_or_minus}1 is: #{plus_or_minus == '+' ? (a+1).to_s : (a-1).to_s}."

此外,这也可以写成

 result = if condition then expression-1 else expression-2 end

可以进行如下赋值

 result = (value-1 if expression-1) || (value-2 if expression-2)

case 表达式

[编辑 | 编辑源代码]

if-elsif-else 表达式(上面)的另一种选择是 case 表达式。Ruby 中的 case 支持多种语法。例如,假设我们想要确定一个数字(由变量 a 给出)与 5 的关系。我们可以说

 a = 1
 case 
 when a < 5 then puts "#{a} is less than 5"    
 when a == 5 then puts "#{a} equals 5"   
 when a > 5 then puts "#{a} is greater than 5" 
 end

请注意,与 if 一样,比较运算符是 ==。赋值运算符是 =。虽然 Ruby 会接受赋值运算符

   when a = 5 then puts "#{a} equals 5"   # WARNING! This code CHANGES the value of a!

但这并不是我们想要的!在这里,我们想要比较运算符。

case 的更简洁语法是隐式比较

 case a
 when 0..4 then puts "#{a} is less than 5"    
 when 5 then puts "#{a} equals 5" 
 when 5..10 then puts "#{a} is greater than 5" 
 else puts "unexpected value #{a} "         # Just in case "a" is bigger than 10 or negative.
 end

注意:由于显式指定了范围,因此最好处理 a 的意外值。当我们预先知道要期望哪些值时,这种简洁的语法可能最有用。例如

 a = "apple"
 case a
 when "vanilla" then "a spice"    
 when  "spinach" then "a vegetable" 
 when "apple" then "a fruit" 
 else "an unexpected value"
 end

如果输入 IRB,则会得到

 => "a fruit"

可以在 Linuxtopia Ruby Programming [1] 中看到 case 的其他用法及其语法的变体。

Ruby 中的 while 语句与 if 以及其他语言的 while(在语法上)非常相似

while <expression>
  <...code block...>
end

只要表达式计算结果为 true,代码块就会反复执行。

此外,与 ifunless 一样,以下操作也是可能的

<...code...> while <expression>

注意以下奇怪的情况有效…

 line = readline.chomp while line != "what I'm looking for"

因此,如果局部变量 line 在此行之前不存在,则当第一次评估循环表达式时,它将具有值 nil

until 语句在功能上类似于 while 语句。与 while 语句不同,until 循环的代码块将只要表达式计算结果为 false 就会执行。

until <expression>
  <...code block...>
end

关键字

[编辑 | 编辑源代码]

return value 会导致其出现的 method 在该点退出并返回指定的值。

请注意,如果 method 没有 return 语句,则最后一个语句的值会隐式返回。

华夏公益教科书