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 代码块