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

NAME

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

` SYNOPSIS
       upvar ?level? otherVar myVar ?otherVar myVar ...?
_________________________________________________________________

yz DESCRIPTION
       這茤R令安排在當前過程中的一茤峖h-
       荍蔔ˍ僆q去引用位於包圍它的過程調用中的變量或引用全局變量。       Level
       可以用   uplevel   命令允釭漸籉顜峖﹛A並且如果第一   otherVar  的第一-
       茼r母不是   #   或一蚍r,則可以被省略(它預設為1)。對於每    otherVar
       參數,upvar    使由    level    給出的過程楨中(如果    level#0
       則在全局層次)的叫這茼W字的變量在當前過程中可以用由相應的          myVar
       參數給出名字來訪問。在調用它的時唹s做        otherVar       的變量不需-
       n存在;可以在第一次引用  myVar   時像普通變量那樣建立它。在調用   upvar
       的時啎@定不能存在一茈s      myVar      的變量。MyVar      總是被作為一-
       蚥僆q的名字來對待,而不是一蚍晡漱葛嚏C即使這茼W字看起來像一-
       蚍掑葛嚏A比如     a(b),仍建立一茈興W的變量。OtherVar     可以引用一-
       蚍迠q變量,或一蚍掑葛嚏CUpvar 返回一茠臟瞗C

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

       namespace                 eval                是改變                Tcl
       命令上下文的另一種方式(除了過程調用之外)。它向棧增加一-
       蚑掍庢岳茠磳雃W字空間上下文。這意味著每  namespace  eval  命令被視為給
       uplevelupvar 命令的另一蚑掍弮h次。例如,info level  1  將返回描z一-
       茤R令的列表,它n麼是最外的過程n麼是最外的         namespace        eval
       命令。還有,uplevel  #0   在最外悸漲W字空間(全局名字空間)中的頂層求@-
       蚑Z本。

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

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

       如果   otherVar   引用一蚍晡漱葛嚏A則為整蚍梜]置的變量跟蹤在  myVar |
       被訪問的時埜N不被調用(但在特定元素上的跟蹤仍將被調用)。特別的,如果這-  |
       蚍晙O env,則對 myVar 的變動將不被正確的傳遞給子進程。                |

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

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

[]
      Hhh

[]
       2001/11/21

m Linux manUpn:
       http://cmpp.linuxforum.net