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