Ruby 塊
Ruby 塊
您已經知道 Ruby 如何定義方法以及您如何呼叫方法。類似地,Ruby 有一個塊的概念。
- 塊由大量的程式碼組成。
- 您需要給塊取個名稱。
- 塊中的程式碼總是包含在大括號 {} 內。
- 塊總是從與其具有相同名稱的函式呼叫。這意味著如果您的塊名稱為 test,那麼您要使用函式 test 來呼叫這個塊。
- 您可以使用 yield 語句來呼叫塊。
語法
block_name{
statement1
statement2
..........
}
在這裡,您將學到如何使用一個簡單的 yield 語句來呼叫塊。您也將學到如何使用帶有引數的 yield 語句來呼叫塊。在例項中,您將看到這兩種型別的 yield 語句。
yield 語句
讓我們看一個 yield 語句的例項:
例項
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
def test
puts "在 test 方法內"
yield
puts "你又回到了 test 方法內"
yield
end
test {puts "你在塊內"}
嘗試一下 ?
以上例項執行結果為:
在 test 方法內 你在塊內 你又回到了 test 方法內 你在塊內
您也可以傳遞帶有引數的 yield 語句。下面是一個例項:
例項
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
def test
yield 5
puts "在 test 方法內"
yield 100
end
test {|i| puts "你在塊 #{i} 內"}
嘗試一下 ?
以上例項執行結果為:
你在塊 5 內 在 test 方法內 你在塊 100 內
在這裡,yield 語句後跟著引數。您甚至可以傳遞多個引數。在塊中,您可以在兩個豎線之間放置一個變數來接受引數。因此,在上面的程式碼中,yield 5 語句向 test 塊傳遞值 5 作為引數。
現在,看下面的語句:
test {|i| puts "你在塊 #{i} 內"}
在這裡,值 5 會在變數 i 中收到。現在,觀察下面的 puts 語句:
puts "你在塊 #{i} 內"
這個 puts 語句的輸出是:
你在塊5 內
如果您想要傳遞多個引數,那麼 yield 語句如下所示:
yield a, b
此時,塊如下所示:
test {|a, b| statement}
引數使用逗號分隔。
塊和方法
您已經看到塊和方法之間是如何相互關聯的。您通常使用 yield 語句從與其具有相同名稱的方法呼叫塊。因此,程式碼如下所示:
例項
#!/usr/bin/ruby
def test
yield
end
test{ puts "Hello world"}
本例項是實現塊的最簡單的方式。您使用 yield 語句呼叫 test 塊。
但是如果方法的最後一個引數前帶有 &,那麼您可以向該方法傳遞一個塊,且這個塊可被賦給最後一個引數。如果 * 和 & 同時出現在引數列表中,& 應放在後面。
例項
#!/usr/bin/ruby
def test(&block)
block.call
end
test { puts "Hello World!"}
嘗試一下 ?
以上例項執行結果為:
Hello World!
BEGIN 和 END 塊
每個 Ruby 原始檔可以聲明當檔案被載入時要執行的程式碼塊(BEGIN 塊),以及程式完成執行後要執行的程式碼塊(END 塊)。
例項
#!/usr/bin/ruby
BEGIN {
# BEGIN 程式碼塊
puts "BEGIN 程式碼塊"
}
END {
# END 程式碼塊
puts "END 程式碼塊"
}
# MAIN 程式碼塊
puts "MAIN 程式碼塊"
一個程式可以包含多個 BEGIN 和 END 塊。BEGIN 塊按照它們出現的順序執行。END 塊按照它們出現的相反順序執行。當執行時,上面的程式輸出以下結果:
BEGIN 程式碼塊 MAIN 程式碼塊 END 程式碼塊