Ruby 简明教程
Ruby - Blocks
您已经了解 Ruby 如何定义方法,在该方法中您可以放置多条语句,然后调用该方法。与此类似,Ruby 有一个块的概念。
-
块由代码块组成。
-
您可以为块指定一个名称。
-
块中的代码始终用大括号({})括起来。
-
块总是从与块名称相同的函数调用。这意味着,如果您有一个名为 test 的块,则使用 test 函数调用此块。
-
使用 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