Ruby - 块

您已经看到 Ruby 如何定义方法,您可以在其中放置多个语句,然后调用该方法。 同样,Ruby 也有 Block 的概念。

  • 块由代码块组成。

  • 您为块指定名称。

  • 块中的代码总是用大括号 ({}) 括起来。

  • 块总是从与块同名的函数调用。 这意味着如果你有一个名为 test 的块,那么你可以使用函数 test 来调用这个块。

  • 您可以使用 yield 语句调用块。


语法

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

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


yield 声明

我们来看一个 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 {|i| puts "You are in the block #{i}"}

这里,变量i 中接收到值5。 现在,观察下面的 puts 语句 −

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

这个 puts 语句的输出是 −

You are in the block 5

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

yield a, b

并且该块是 −

test {|a, b| statement}

参数将用逗号分隔。


块和方法

您已经了解了块和方法如何相互关联。 您通常使用与块同名的方法中的 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 和 END 块

每个 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