Ruby块

Ruby代码块在其他编程语言中被称为闭包。 它由一组代码组成,它们始终用大括号括起来,或者在do..end之间书写。 大括号语法总是具有比do..end语法更高的优先级。也就是说大括号优先级高,do..end优先级低。

Ruby块可用两种方式来编写 -

  • doend之间的多行(多行块不是内联的)
  • 大括号{}之间的内嵌

两者都是相同的,都具有相同的功能。要调用块,您需要使用具有与块相同名称的函数。块总是与调用函数一起。 块可以有自己的参数。

语法:

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

示例:

下面的例子显示了多行程序段。

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

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

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

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

将上面代码保存到文件:yield-statment.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby yield-statment.rb
This is method
This is block
You will be back to method
This is block

F:\worksp\ruby>

执行met方法到达yield语句行时,块内的代码被执行。 当块执行完成时,met方法的代码继续。

用yield语句传递参数

可以使用yield语句传递一个或多个参数。

示例:

#!/usr/bin/ruby   

def met   
   yield 1   
   puts "This is method"   
   yield 2   
end   
met {|i| puts "This is block #{i}"}

将上面代码保存到文件:yield-statment-pass-parm.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby yield-statment-pass-parm.rb
This is block 1
This is method
This is block 2

F:\worksp\ruby>

块变量

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

示例:

#!/usr/bin/ruby   

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

将上面代码保存到文件:block-variables.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby block-variables.rb
Inside the block: 0
Inside the block: 1
Inside the block: 2
Outside the block: Outer variable

F:\worksp\ruby>

BEGIN和END块

Ruby BEGINEND块用于声明该文件正在加载,文件已分别加载。

示例:

#!/usr/bin/ruby   

BEGIN {   
  puts "code block is being loaded"   
}   

END {   
  puts "code block has been loaded"   
}   
puts "This is the code block"

将上面代码保存到文件:block-begin-end.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby block-begin-end.rb
code block is being loaded
This is the code block
code block has been loaded

F:\worksp\ruby>

符号参数(&块)

&块是一种将参考(而不是局部变量)传递给块的方法。这里,块之后的&只是一个引用的名字,任何其他的名字都可以用它来代替this

示例:

#!/usr/bin/ruby   

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

将上面代码保存到文件:block-and-amperand.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby block-and-amperand.rb
This is method
This is &block example

F:\worksp\ruby>

这里,met方法中的块变量是对块的引用,它使用call来执行。 调用方法与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."

将上面代码保存到文件:yield-self.rb , 执行上面代码得到以下结果 -

F:\worksp\ruby>ruby yield-self.rb
I am reading a thriller novel which has 564 pages.

F:\worksp\ruby>

上一篇: Ruby方法 下一篇: Ruby模块