bionic (3) upvar.3tcl.gz

Provided by: manpages-zh_1.6.3.2-1_all bug

NAME

       upvar - 建立到在不同棧楨上的變量的連接

總覽 SYNOPSIS

       upvar ?level? otherVar myVar ?otherVar myVar ...?
_________________________________________________________________

描述 DESCRIPTION

       這個命令安排在當前過程中的一個或多個局部變量去引用位於包圍它的過程調用中的變量或引用全局變量。 Level 可以
       用 uplevel 命令允許的任何形式,並且如果第一個 otherVar 的第一個字母不是 # 或一個數字,則可以被省略(它缺省
       爲1)。對於每個  otherVar 參數,upvar 使由 level 給出的過程楨中(如果 level#0 則在全局層次)的叫這個名字
       的變量在當前過程中可以用由相應的  myVar  參數給出名字來訪問。在調用它的時候叫做  otherVar  的變量不需要存
       在;可以在第一次引用  myVar  時象普通變量那樣建立它。在調用  upvar  的時候一定不能存在一個叫  myVar  的變
       量。MyVar    總是被作爲一個變量的名字來對待,而不是一個數組的元素。即使這個名字看起來象一個數組元素,比如
       a(b),仍建立一個正規的變量。OtherVar 可以引用一個標量變量,或一個數組元素。Upvar 返回一個空串。

       upvar 命令簡化了傳名調用(call-by-name)過程的實現並使它易於建立如同 Tcl 過程的新控制結構。例如,考慮下列過
       程:
              proc add2 name {
                upvar $name x
                set x [expr $x+2]
              }
       調用 Add2 時加上給出一個變量名字的一個參數,它向這個變量的值加二。儘管 add2 可以使用 uplevel  替代  upvar
       來實現,upvar 簡便了 add2 訪問在調用者過程楨中的變量。

       namespace  eval 是改變 Tcl 命令上下文的另一種方式(除了過程調用之外)。它向棧增加一個調用楨來表示名字空間上
       下文。這意味着每個 namespace eval 命令被視爲給 uplevelupvar 命令的另一個調用層次。例如,info level  1
       將返回描述一個命令的列表,它要麼是最外的過程要麼是最外的 namespace eval 命令。還有,uplevel #0 在最外面的
       名字空間(全局名字空間)中的頂層求值一個腳本。

       如果刪除(unset)一個 upvar 變量(比如,上面的 add2  中的  x  ),則  unset  操作影響它所連接到的變量,而不是 │
       upvar   變量。除了退出在其中定義它的那個過程之外,沒有方法刪除一個  upvar  變量。但是,可以通過執行另一個 │
       upvar 命令來爲一個 upvar 變量重定目標(retarget)。                                                         │

Traces  upvar                                                                                                  │
       upvar 以一種直接但可能不是預期的方式與 trace 交互。如果在 otherVar 上定義了一個變量跟蹤,涉及 myVar  的動 │
       作將觸發這個追蹤。但是,傳遞給跟蹤過程將是  myVar 的名字,而不是 otherVar 的名字。 所以,下列代碼的輸出將 │
       是 localVar 而不是 originalVar:                                                                           │
              proc traceproc { name index op } {puts $name}proc setByUpvar { name value } {upvar $name localVarset localVar $value}set originalVar 1trace variable originalVar w traceprocsetByUpvar originalVar 2}                                                                                                  │

       如果 otherVar 引用一個數組的元素,則爲整個數組設置的變量跟蹤在 myVar  被訪問的時候將不被調用(但在特定元素 │
       上的跟蹤仍將被調用)。特別的,如果這個數組是 env,則對 myVar 的變動將不被正確的傳遞給子進程。              │

參見 SEE ALSO

       global(n), namespace(n), uplevel(n), variable(n)

關鍵字 KEYWORDS

       context, frame, global, level, namespace, procedure, variable

[中文版維護人]

       寒蟬退士

[中文版最新更新]

       2001/11/21

《中國 Linux 論壇 man 手冊頁翻譯計劃》:

       http://cmpp.linuxforum.net

       本頁面中文版由中文 man 手冊頁計劃提供。
       中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh