ZetCode

Ruby for 关键字

最后修改日期:2025 年 4 月 27 日

本教程解释了如何使用 Ruby 的 for 关键字进行迭代。for 循环提供了一种遍历集合的简洁语法。

for 关键字创建了一个迭代集合的循环。它会自动将每个元素分配给一个循环变量。循环将一直运行直到所有元素都被处理。

虽然 Rubyist 通常更喜欢 each,但 for 在某些场景下仍然有用。它对于来自其他语言的开发者来说更熟悉。循环变量在循环结束后仍然在作用域内。

基本 for 循环与范围

这个简单的例子演示了如何迭代一个数字范围。循环变量按顺序获取每个值。

basic_for_range.rb
for i in 1..5
  puts "Current number: #{i}"
end

puts "Final value: #{i}"

循环从 1 到 5(包含)。请注意,变量 i 在循环结束后仍然可以访问。这与块级作用域的迭代器不同。

迭代数组

数组与 for 循环自然配合。每个元素都会依次通过循环变量可用。

for_array.rb
fruits = ["apple", "banana", "cherry"]

for fruit in fruits
  puts "Fruit: #{fruit.capitalize}"
end

puts "Last fruit: #{fruit}"

循环按顺序处理每个数组元素。变量 fruit 保存每个值。同样,在循环完成后它仍然存在。

嵌套 for 循环

for 循环可以嵌套以处理多维数据。每个级别都有自己的循环变量。

nested_for.rb
matrix = [
  [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9]
]

for row in matrix
  for cell in row
    print "#{cell} "
  end
  puts
end

外层循环处理每一行,而内层循环处理单个单元格。这种模式适用于任何嵌套的可枚举结构。

for 循环与 Hash

Hash 需要特殊处理,因为它们包含键值对。循环变量将成为包含这两个元素的数组。

for_hash.rb
person = {name: "John", age: 30, city: "New York"}

for key, value in person
  puts "#{key}: #{value}"
end

循环将每个键值对解包到单独的变量中。如果没有这两个变量,您将得到包含两个元素的数组。

迭代期间修改元素

for 循环允许在迭代期间修改集合元素。更改会影响原始集合。

modifying_for.rb
numbers = [1, 2, 3, 4, 5]

for num in numbers
  num *= 2
end

puts numbers.inspect

此示例尝试将每个数字加倍。但是,原始数组保持不变,因为 num 是一个副本。使用 map! 进行原地修改。

for 循环中的 Break 和 Next

控制流关键字在 for 循环中的作用与其他循环类似。break 会完全退出,而 next 会跳到下一个。

control_flow.rb
for i in 1..10
  next if i % 2 == 0
  break if i > 7
  puts "Odd number: #{i}"
end

循环使用 next 跳过偶数,并在达到 7 后使用 break 完全停止。这些关键字提供了精确的流程控制。

for 与 each 的对比

本示例将 for 与 Ruby 更倾向的 each 迭代器进行了对比。主要区别在于变量作用域和返回值。

for_vs_each.rb
# for loop version
for x in [1, 2, 3]
  puts x
end
puts "x after for: #{x}"

# each version
[1, 2, 3].each do |y|
  puts y
end
puts "y after each: #{y}" rescue puts "y undefined"

for 循环的变量会保留,而 each 的块变量则不会。此外,for 返回原始集合。

来源

Ruby 关键字文档

本教程通过示例介绍了 Ruby 的 for 关键字,包括范围迭代、数组处理、嵌套循环和控制流。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 Ruby 教程