Ruby可借由条件分支控制程式执行的流程。条件分支依据一个条件式的测试结果为真值或伪值,而将流程将转移至相关连的程式区块。若条件式计算结果为 false 或 nil,则视为条件不符 (测试为伪);否则条件成立 (测试为真)。在许多常见的程式语言中,条件分支是一种叙述,它们决定哪段程式区块被执行但本身没有值。 Ruby 则将条件分支作为式子,所以它们也有值。举例而言,一个 if 式子不只决定执行哪段程式区块,它本身也会有一个结果值。若想在一行内写出完整的 if 式,则必须以 then 隔开条件式和程式区块。如下所示:

程序员可借由 elsif 与 else 区块加上更多可用的测试条件以满足其他需要考虑的情况。仅当执行 if 区块之条件不符时,才会再考虑 elsif 与 else 区块之执行条件。if修饰词组表示当 if 右边之条件成立时才执行 if 左边的式子。此一由右到左的演算逻辑并不常见,但它提供了更贴近日常用语的表达形式。由于它不需要 end 结束叙述,所以也具有文字简洁的优点。 if修饰词组惯例上用于叙述需要加上条件判断且条件式可以简短地在一行中写完的情况。

unless式和 if式作用相反,仅当条件不符时才执行相关连的程式区块。

可将 unless式看作 if式之否定型:

如同 if修饰词组,unless 也有修饰词组,如下:

"short-if" 叙述让我们以很简短的方式计算式子并回传一个值。这经常用于串接字串时。

"short-if"之语法即 [条件式 ? 式1 : 式2] ,当条件式为真时传回式1之值,否则传回式2之值。它也被称为三元运算子。由于其可读性较差,建议只使用于次要的工作,如字串格式动作。

我们使用 case 叙述测试一连串的条件。case 内部使用运算子 === 一次测试多个条件式。基于 Ruby 的个体导向本性,出现在 when 条件中的个体会套用 === 运算,作用如同 (6..10) === i。 在下例中,将会测试字串是否等于第一个 when 中的字串,接着测试是否符合第二个 when 的字样规则式。

一个 while式就是一个反复执行的 if式。只要条件成立,程式区块的内容就会一次又一次地执行。其语法为 while condition ... end ,其中包含当 condition 为真时就重复执行的程式区块。

语法中之 do 或 : 可以省略不写。但若要在一行内写出 while 式,则必须以 do 或 : 隔开条件式或程式区块。

while 也和 if 、unless 一样,有可用于单独叙述的修饰词组:

irb> puts i+=1 while i < 3

下列状况也可以运作:

当循环第一次测试条件式时,区域变数 line 尚未定义,此时其值将被视为 nil 参与条件式测试。

until式是 while的否定型,当条件式不符时才会反复执行。

Ruby 的 for 可提供与 C 的 for 相同的功用,但更有弹性。循环可以自行从一个聚合体(colection) - 如阵列、杂凑表、连续数值范围等等 - 提取一个元素执行,而不需程序员指示它怎么做:

聚合体也可以是一个数值范围,这用法便是多数人所说的 for 循环用法:

在 Ruby 中, for 其实就是 each迭代器的另一种写法。下列两种句型之意义相等:

迭代器通常可以取代传统的循环,一般说来使用迭代器会方便得多。

next 的意义是跳到循环起始处继续下一个迭代 (如同 C 的 continue)。

return 不只是脱离循环,也会脱离包含这循环的方法(method)。如果给它一个引数,该引数将视为方法的回传值,而不是传回 nil 。

于迭代器或程式区块之中使用 return 时,其意义为脱离包含迭代器或程式区块的方法,而非仅脱离迭代器或程式区块。

def q1

上例中,return 将直接脱离 q1 方法并回传sum + x之值,而非仅脱离 inject 区块。