ZetCode

Ruby do 关键字

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

本教程将解释如何使用 Ruby 的 do 关键字来创建代码块。代码块是匿名函数,可以传递给方法。

do 关键字在 Ruby 中用于开始一个多行代码块。它与 end 配对,用于界定代码块的主体。代码块可以接受参数。

Ruby 代码块有两种形式:多行代码块使用 do...end,单行代码块使用 {...}。对于较长的代码块,使用 do 形式更易读。

带 Array#each 的基本 do 代码块

此示例显示了 doeach 方法的最简单用法。该代码块会为每个数组元素执行一次。

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

fruits.each do |fruit|
  puts "I love #{fruit}s!"
end

do 关键字开始代码块,|fruit| 是参数。该代码块会运行三次,每次对应一个数组元素。

带多个参数的 do 代码块

代码块可以接受多个参数。此示例使用 each_with_index,它同时提供值和索引。

multiple_params.rb
colors = ["red", "green", "blue"]

colors.each_with_index do |color, index|
  puts "Color #{index + 1}: #{color}"
end

代码块同时接收数组元素及其索引。参数在管道符内用逗号分隔。这将打印一个编号的颜色列表。

带 do 代码块的自定义方法

方法可以使用 yield 接受代码块。此示例展示了如何创建一个接受代码块的方法。

custom_method.rb
def repeat(times)
  times.times do |i|
    yield(i + 1)
  end
end

repeat(3) do |count|
  puts "Iteration #{count}"
end

repeat 方法会根据指定的次数 `yield` 给它的代码块。代码块将当前迭代计数作为参数接收。

带 Hash 迭代的 do 代码块

可以使用 each 迭代 Hash,它会生成键值对。do 代码块使这更加易读。

hash_iteration.rb
person = { name: "Alice", age: 30, occupation: "Developer" }

person.each do |key, value|
  puts "#{key.capitalize}: #{value}"
end

代码块为每个 Hash 对接收两个参数。do 形式非常适合像此示例这样的多行 Hash 处理。

带文件操作的 do 代码块

文件操作通常使用代码块进行自动资源管理。此示例展示了带代码块的 File.open

file_operations.rb
File.open("data.txt", "w") do |file|
  file.puts "Line 1"
  file.puts "Line 2"
  file.puts "Line 3"
end

代码块执行后,文件会自动关闭。这种模式确保了即使代码块内发生错误,也能正确清理资源。

嵌套的 do 代码块

代码块可以嵌套以进行多维迭代。此示例展示了带 do 代码块的嵌套 each 调用。

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

matrix.each do |row|
  row.each do |cell|
    print "#{cell} "
  end
  puts
end

外部代码块处理每一行,而内部代码块处理单个单元格。do 形式清晰地展示了嵌套结构。

带 begin/rescue 的 do 代码块

代码块可以包含异常处理。此示例将代码块代码包装在 begin/rescue 中进行错误管理。

error_handling.rb
def safe_divide(a, b)
  begin
    yield(a, b)
  rescue ZeroDivisionError
    puts "Cannot divide by zero!"
  end
end

safe_divide(10, 2) do |x, y|
  puts "#{x} / #{y} = #{x / y}"
end

safe_divide(10, 0) do |x, y|
  puts "#{x} / #{y} = #{x / y}"
end

代码块包含除法逻辑,而方法处理错误。这种关注点分离使代码更易于维护。

来源

Ruby 关键字文档

本教程涵盖了 Ruby 的 do 关键字,并提供了实际示例,展示了迭代、方法代码块、文件操作和错误处理。

作者

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

列出 所有 Ruby 教程