2013-12-21 101 views
2

我是TCL中面向對象編程的新手。我安裝了包含TclOO包的ActiveTCL 8.6,以便在TCL中使用類和對象。我想創建一個對象並調用各種過程以使用它。例如,我嘗試了下面這段代碼:TCL:將對象作爲過程的參數傳遞給ActiveTcl 8.6

oo::class create Test { 
    method func {} { 
     puts "Hello World!" 
    } 
} 

proc speak { myObj } { 
    myObj func 
} 

Test create testObj 

testObj func; # This prints "Hello World!" 

speak testObj; # This raises an error -> invalid command name "myObj" 

我應該怎麼做才能在「speak」過程中使用對象testObj?

回答

3

當您傳遞一個對象時,您實際上是傳遞了名稱的對象。然後,將變量,形式參數,持有的名稱和取消引用變量使用對象(而不是變量本身):

proc speak { myObj } { 
    $myObj func 
} 

注意,你也可以使用一個參數set閱讀變量;下面這段代碼就相當於上面,但更囉嗦:

proc speak { myObj } { 
    [set myObj] func 
} 

它也可能使別名的對象,然後,可以有你想要的任何名稱,但是這是而不是,因爲這些名稱總是有效的全球化程序。

# Don't do this! 
proc speak { myObj } { 
    interp alias {} $myObj {} myObj 
    myObj func 
} 

這使得當你傳遞一個對象到構造函數或將其存儲在具有可以使用它的許多命令的命名空間更有意義。 (實際上,rename這個對象放入另一個對象或命名空間,並且該對象將由您移動到的實體的生命週期管理;這是做UML合成的最簡單,最推薦的方法,並且廣泛用於執行TDBC驅動程序,關鍵是一生;過程調用通常不是你想限制傳入對象的生命期的東西。)

+0

非常感謝! – Rubeinstein

相關問題