Ruby 简明教程

Ruby - Blocks

您已经了解 Ruby 如何定义方法,在该方法中您可以放置多条语句,然后调用该方法。与此类似,Ruby 有一个块的概念。

  1. 块由代码块组成。

  2. 您可以为块指定一个名称。

  3. 块中的代码始终用大括号({})括起来。

  4. 块总是从与块名称相同的函数调用。这意味着,如果您有一个名为 test 的块,则使用 test 函数调用此块。

  5. 使用 yield 语句调用块。

Syntax

block_name {
   statement1
   statement2
   ..........
}

在此,您将学习使用简单的 yield 语句调用块。您还将学习如何使用带有参数的 yield 语句调用块。您将使用两种类型的 yield 语句检查示例代码。

The yield Statement

我们来看一个 yield 语句的示例 −

#!/usr/bin/ruby

def test
   puts "You are in the method"
   yield
   puts "You are again back to the method"
   yield
end
test {puts "You are in the block"}

这会产生以下结果 −

You are in the method
You are in the block
You are again back to the method
You are in the block

您还可以使用 yield 语句传递参数。这里有一个示例 −

#!/usr/bin/ruby

def test
   yield 5
   puts "You are in the method test"
   yield 100
end
test {|i| puts "You are in the block #{i}"}

这会产生以下结果 −

You are in the block 5
You are in the method test
You are in the block 100

在此,yield 语句后面写入了参数。您甚至可以传递多个参数。在块中,您将变量放在两个竖线(||)之间以接受参数。因此,在前面的代码中,yield 5 语句将值 5 作为参数传递给 test 块。

现在,看以下语句 −

test {|i| puts "You are in the block #{i}"}

在此,值 5 在变量 i 中接收。现在,观察以下 puts 语句 −

puts "You are in the block #{i}"

此 puts 语句的输出为 −

You are in the block 5

如果您想要传递多个参数,则 yield 语句变为 −

yield a, b

并且该块为 −

test {|a, b| statement}

参数将用逗号分隔。

Blocks and Methods

您已经了解块和方法如何相互关联。您通常使用 yield 语句从与块名称相同的调用块。 因此,您编写 −

#!/usr/bin/ruby

def test
   yield
end
test{ puts "Hello world"}

这个示例是实现块的最简单方法。您使用 yield 语句来调用测试块。

但如果一个方法的最后一个参数之前带有 &,则可以将一个块传递给此方法,并且该块将被分配给最后一个参数。如果 * 和 & 都存在于参数列表中,则 & 应出现在后面。

#!/usr/bin/ruby

def test(&block)
   block.call
end
test { puts "Hello World!"}

这会产生以下结果 −

Hello World!

BEGIN and END Blocks

每个 Ruby 源文件都可以声明代码块以在文件加载时运行(BEGIN 块)并在程序执行结束后运行(END 块)。

#!/usr/bin/ruby

BEGIN {
   # BEGIN block code
   puts "BEGIN code block"
}

END {
   # END block code
   puts "END code block"
}
   # MAIN block code
puts "MAIN code block"

一个程序可能包含多个 BEGIN 和 END 块。BEGIN 块按照遇到的顺序执行。END 块按照反向顺序执行。执行时,上述示例产生以下结果:

BEGIN code block
MAIN code block
END code block