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模組