个性化阅读
专注于IT技术分析

Ruby代码块或闭包用法详解

本文概述

Ruby代码块在其他编程语言中称为闭包。它由一组代码组成, 这些代码始终用大括号括起来或写在do..end之间。大括号语法始终比do..end语法具有更高的优先级。大括号具有较高的优先级, 而do的优先级较低。

块以两种方式写入:

  • do和end之间的多行(多行块是inot inline)
  • 括号之间的内联{}

两者相同并且具有相同的功能。

要调用一个块, 你需要具有一个与该块同名的函数。

始终使用功能调用块。块可以有自己的参数。

句法:

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

例:

以下示例显示了多行块。

[10, 20, 30].each do |n| 
 puts n 
end

输出

Ruby代码块或闭包用法详解1

下面的示例显示了内联块。

[10, 20, 30].each {|n| puts n}

输出

Ruby代码块或闭包用法详解2

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代码块或闭包用法详解3

在执行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代码块或闭包用法详解4

块变量

我们可以在块参数的内部和外部使用相同的变量。让我们看下面的例子。

例:

#!/usr/bin/ruby 

    x = "Outer variable"  
    3.times do |x|  
      puts "Inside the block: #{x}"  
    end  
    puts "Outside the block: #{x}"

输出

Ruby代码块或闭包用法详解5

在此示例中, 我们在块内部将相同的变量用作块参数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代码块或闭包用法详解6

&符参数(&block)

&block是一种将对块的引用(而不是局部变量)传递给方法的方法。

在此, &后面的正楷字只是参考的名称, 可以使用任何其他名称代替。

例:

def met(&block) 
  puts "This is method" 
  block.call 
end 
met { puts "This is &block example" }

输出

Ruby代码块或闭包用法详解7

在这里, 方法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代码块或闭包用法详解8

赞(0) 打赏
未经允许不得转载:srcmini » Ruby代码块或闭包用法详解
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏