Ruby代码块或闭包用法详解

本文概述

  • yield语句
  • 块变量
  • BEGIN和END块
  • & 符参数(& block)
  • 使用默认值初始化对象
Ruby代码块在其他编程语言中称为闭包。它由一组代码组成, 这些代码始终用大括号括起来或写在do..end之间。大括号语法始终比do..end语法具有更高的优先级。大括号具有较高的优先级, 而do的优先级较低。
块以两种方式写入:
  • do和end之间的多行(多行块是inot inline)
  • 括号之间的内联{}
两者相同并且具有相同的功能。
要调用一个块, 你需要具有一个与该块同名的函数。
【Ruby代码块或闭包用法详解】始终使用功能调用块。块可以有自己的参数。
句法:
block_name{ statement1 statement2 .......... }

例:
以下示例显示了多行块。
[10, 20, 30].each do |n| puts n end

输出
Ruby代码块或闭包用法详解

文章图片
下面的示例显示了内联块。
[10, 20, 30].each {|n| puts n}

输出
Ruby代码块或闭包用法详解

文章图片
yield语句 yield语句用于调用带有值的方法中的块。
例:
#!/usr/bin/ruby def met puts "This is method" yield puts "You will be back to method" yield end met {puts "This is block"}

输出
Ruby代码块或闭包用法详解

文章图片
在执行met方法时, 当我们到达屈服线时, 将执行块内的代码。块执行完成后, met方法的代码继续。
通过yield语句传递参数
yield语句可以传递一个或多个参数。
例:
#!/usr/bin/ruby def met yield 1 puts "This is method" yield 2 end met {|i| puts "This is block #{i}"}

输出
Ruby代码块或闭包用法详解

文章图片
块变量 我们可以在块参数的内部和外部使用相同的变量。让我们看下面的例子。
例:
#!/usr/bin/ruby x = "Outer variable" 3.times do |x| puts "Inside the block: #{x}" end puts "Outside the block: #{x}"

输出
Ruby代码块或闭包用法详解

文章图片
在此示例中, 我们在块内部将相同的变量用作块参数x, 将块外部的变量用作变量x。
BEGIN和END块 Ruby BEGIN和END块分别用于声明正在加载文件和已加载文件。
例:
#!/usr/bin/ruby BEGIN { puts "code block is being loaded" } END { puts "code block has been loaded" } puts "This is the code block"

输出
Ruby代码块或闭包用法详解

文章图片
& 符参数(& block) & block是一种将对块的引用(而不是局部变量)传递给方法的方法。
在此, & 后面的正楷字只是参考的名称, 可以使用任何其他名称代替。
例:
def met(& block) puts "This is method" block.call end met { puts "This is & block example" }

输出
Ruby代码块或闭包用法详解

文章图片
在这里, 方法met内部的块变量是对该块的引用。它通过调用mehtod执行。调用方法与yield方法相同。
使用默认值初始化对象 Ruby有一个称为yield(self)的初始化程序。这里, self是要初始化的对象。
例:
class Novel attr_accessor :pages, :category def initialize yield(self) end end novel = Novel.new do |n| n.pages = 564 n.category = "thriller" end puts "I am reading a #{novel.category} novel which has #{novel.pages} pages."

输出
Ruby代码块或闭包用法详解

文章图片

    推荐阅读