Ruby 使用手冊

程序物件 Procedure objects

當有意料之外的事件發生時,誰都希望能夠有指定的回應措施。這其實很簡單,只要我們能夠將程式碼區塊如引數般傳至其他方法,也就是能夠像使用 資料 般一樣對待 程式碼。

使用 Proc.new 創造一個新的程序物件 (procedure object) (編註:原英文版使用 proc 方法,現在的慣例改成使用 Proc.new 或 lambda):

ruby> quux = Proc.new {
    |   puts "QUUXQUUXQUUX!!!"
    | }
   #<Proc:0x4017357c>

現在 quux 所指的是一個物件,與大部分物件一樣,具有能夠被呼叫的行為。具體來說,可以透過 call 方法來執行:

ruby> quux.call
QUUXQUUXQUUX!!!
   nil

那麼,可以將 quux 用作方法引數嗎?當然可以。

ruby> def run( p )
    |   puts "About to call a procedure..."
    |   p.call
    |   puts "There: finished."
    | end
   nil
ruby> run quux
About to call a procedure...
QUUXQUUXQUUX!!!
There: finished.
   nil

利用 trap 方法,我們能夠針對任何系統信號,指派不同應對措施。

ruby> inthandler = Proc.new { puts "^C was pressed." }
   #<Proc:0x401730a4>
ruby> trap "SIGINT", inthandler
   #<Proc:0x401735e0>

一般來說,按下 ^C 會離開直譯器。現在,會輸出一個訊息,然後直譯器繼續運行,不會失去正在進行的工作。(你不會一直受困於直譯器內,隨時都可以輸入 exit 來離開。)

前往下一節前,我們要注意:與信號連結 (binding) 前,並不一定要為程序物件命名。匿名 (anonymous) 的程序物件就像

ruby> trap "SIGINT", Proc.new { puts "^C was pressed." }
   nil

或更常見的寫法如下:

ruby> trap "SIGINT" do
    |   puts "^C was pressed."
    | end
   nil

如果只有一行,我們會更簡潔點地寫成:

ruby> trap("SIGINT") { puts "^C was pressed." }
   nil

(編著:此段範例與原英文版略有不同)

Copyright (c) 2005-2008 Mark Slagell,中文翻譯 Ruby Taiwan 社群

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.

A copy of the license is included in the section entitled "GNU Free Documentation License."