Ruby 编程/语法/控制结构
Ruby 可以使用条件分支控制代码的执行。条件分支根据测试 表达式 的结果,执行代码块,取决于测试表达式是真还是假。如果测试表达式计算结果为常量 false
或 nil
,则测试为假;否则,测试为真。注意,数字 零
被认为是真,而许多其他编程语言认为它是假。
在许多流行的编程语言中,条件分支是语句。它们可以影响执行哪段代码,但它们本身不会产生值。然而,在 Ruby 中,条件分支是表达式。它们会像其他表达式一样计算出值。例如,一个 if
表达式不仅会确定是否执行子代码块,还会产生它自己的值。如果未执行任何代码块,则 if 表达式将产生 nil。例如,以下 if
表达式计算结果为 3
if true 3 end
Ruby 的条件分支在下面解释。
示例
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-表达式与 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
当代码块中执行的代码只有一行时,“单行代码”非常方便。
elsif (请注意它是 elsif
而不是 elseif
) 和 else 代码块通过提供容纳其他测试的选项,让您更有效地控制脚本。只有在 if
测试为假时,才会考虑 elsif
和 else
代码块。您可以包含任意数量的 elsif
代码块,但只有一个 if
代码块和一个 else
代码块。
语法
if expression ...code block... elsif another expression ...code block... elsif another expression ...code block... else ...code block... end
“短路 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)
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 编程 [1] 中,可以找到使用 case 及其语法变化的其他方法。
Ruby 中的 while
语句与 if
以及其他语言的 while
(语法上)非常相似
while <expression> <...code block...> end
代码块将一次又一次地执行,只要表达式计算结果为 true
。
此外,与 if
和 unless
一样,以下操作也是可能的
<...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
会导致包含它的方法在该点退出并返回指定的值。
请注意,如果一个方法没有 return 语句,则隐式返回最后一条语句的值。