Ruby 编程/语法/控制结构
Ruby 可以使用条件分支来控制代码的执行。条件分支根据测试表达式的结果来执行代码块,具体取决于测试表达式为真还是假。如果测试表达式计算结果为常量 false
或 nil
,则测试为假;否则为真。请注意,数字 zero
被认为是真,而许多其他编程语言认为它是假。
在许多流行的编程语言中,条件分支是语句。它们可以影响执行的代码,但它们本身不产生值。然而,在 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 Programming [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
会导致其出现的 method 在该点退出并返回指定的值。
请注意,如果 method 没有 return 语句,则最后一个语句的值会隐式返回。