Ruby塊
Ruby代碼塊在其他編程語言中被稱爲閉包。 它由一組代碼組成,它們始終用大括號括起來,或者在do..end
之間書寫。 大括號語法總是具有比do..end
語法更高的優先級。也就是說大括號優先級高,do..end
優先級低。
Ruby塊可用兩種方式來編寫 -
-
do
和end
之間的多行(多行塊不是內聯的) - 大括號
{}
之間的內嵌
兩者都是相同的,都具有相同的功能。要調用塊,您需要使用具有與塊相同名稱的函數。塊總是與調用函數一起。 塊可以有自己的參數。
語法:
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 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-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>