📜  Ruby块

📅  最后修改于: 2021-01-08 13:08:40             🧑  作者: Mango

红宝石块

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

块以两种方式写入:

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

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

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

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

句法:

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

例:

以下示例显示了多行块。

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

输出:

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

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

输出:

收益声明

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"}

输出:

在执行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}"} 

输出:

块变量

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

例:

#!/usr/bin/ruby 

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

输出:

在此示例中,我们在块内部将相同的变量用作块参数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"

输出:

&符参数(&block)

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

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

例:

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

输出:

在这里,方法met中的块变量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." 

输出: