Ruby 循环

在 Ruby 编程语言中,循环是一种用于重复执行代码块的结构。以下是对 Ruby 中常见循环结构的中文讲解,涵盖主要类型及其用法,力求简洁清晰:

1. while 循环

while 循环在条件为真时重复执行代码块。

# 语法
while 条件 do
  # 代码块
end

# 示例
count = 1
while count <= 5 do
  puts "第 #{count} 次循环"
  count += 1
end

输出

第 1 次循环
第 2 次循环
第 3 次循环
第 4 次循环
第 5 次循环

说明:当 count <= 5 为真时,循环继续;条件为假时,循环结束。do 可以省略,单行时可用冒号 : 代替。


2. until 循环

until 循环与 while 相反,在条件为假时执行代码块。

# 语法
until 条件 do
  # 代码块
end

# 示例
count = 1
until count > 5 do
  puts "第 #{count} 次循环"
  count += 1
end

输出:与 while 示例相同。
说明until 相当于“直到条件为真才停止”。do 同样可省略。


3. for 循环

for 循环用于遍历范围、数组或其他可迭代对象。

# 语法
for 变量 in 集合 do
  # 代码块
end

# 示例
for i in 1..5 do
  puts "第 #{i} 次循环"
end

输出:同上。
说明

  • 1..5 表示包含 1 到 5 的范围(包括 5)。
  • 1...5 表示 1 到 4(不包括 5)。
  • for 循环在 Ruby 中较少使用,因为迭代器(如 each)更常见。

4. each 迭代器

Ruby 中更推荐使用 each 方法迭代数组、范围等,语法更简洁。

# 语法
集合.each do |变量|
  # 代码块
end

# 示例
(1..5).each do |i|
  puts "第 #{i} 次循环"
end

输出:同上。
说明

  • each 是 Ruby 中最常用的迭代方式,适用于数组、哈希、范围等。
  • 单行可用 {} 代替 do...end
  (1..5).each { |i| puts "第 #{i} 次循环" }

5. times 循环

times 是整数对象的方法,用于执行指定次数的循环。

# 语法
n.times do |变量|
  # 代码块
end

# 示例
5.times do |i|
  puts "第 #{i + 1} 次循环"
end

输出:同上。
说明i 从 0 开始,循环执行 n 次。单行可用 {}


6. loop 方法

loop 是一个无限循环,除非通过 break 终止。

# 语法
loop do
  # 代码块
  break if 条件
end

# 示例
count = 1
loop do
  puts "第 #{count} 次循环"
  count += 1
  break if count > 5
end

输出:同上。
说明:适合需要手动控制终止条件的场景。


7. 循环控制语句

  • break:跳出循环,终止执行。
  for i in 1..5
    break if i == 3
    puts i
  end
  # 输出:1, 2
  • next:跳过当前循环,进入下一次迭代。
  for i in 1..5
    next if i == 3
    puts i
  end
  # 输出:1, 2, 4, 5
  • redo:重新执行当前循环(不重新检查条件)。
  for i in 1..5
    puts i
    redo if i == 3
    break if i == 3
  end
  # 输出:1, 2, 3(重复多次直到其他条件终止)

8. 其他迭代器

  • map/collect:遍历并返回新数组。
  array = [1, 2, 3]
  new_array = array.map { |x| x * 2 }
  puts new_array  # 输出:[2, 4, 6]
  • select:筛选符合条件的元素。
  array = [1, 2, 3, 4]
  even = array.select { |x| x.even? }
  puts even  # 输出:[2, 4]

注意事项

  • Ruby 强调简洁和可读性,推荐使用 eachmap 等迭代器代替传统循环。
  • 避免无限循环,确保有退出条件(如 break)。
  • 循环中变量的作用域:foreach 的块内变量在块外不可用(块作用域)。

如果你有具体问题或需要更深入的示例,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注