簡體   English   中英

如何在while循環中創建變量global

[英]how to make a variable global inside a while loop

以下是使用while循環打印1到10之間的數字的TCL腳本。

set b 1

while {$b<11} {
    puts $b
    incr b
}

在上面的腳本中,如何將“puts $ b”輸出作為全局輸出。 那么我們可以在腳本中的任何地方使用它嗎?

我需要以下內容:

set b 1

while {$b<11} {
    set a $b
    incr b
}

puts "This is number $a"

如果我在外部循環中使用$a ,它應該將輸出打印為:

This is number 1
This is number 2
This is number 3
.
.
.
This is number 10

Tcl真正嚴格運作; 它在你告訴它的地方做事情。 但是,您可以做的一件事就是對變量進行trace ,以便在寫入變量時運行某些代碼。

# This is Tcl 8.5 syntax; let me know if you want it for 8.4 and before
trace add variable ::a write {apply {args {
   puts "This is number $::a"
}}}

我上面使用了完全限定的變量名; 跟蹤實際上a在namespace ::的變量a上。
然后, 在設置跟蹤之后 ,當我們執行以下操作時:

set b 1

while {$b<11} {
    set a $b
    incr b
}

然后輸出是:

This is number 1
This is number 2
This is number 3
This is number 4
This is number 5
This is number 6
This is number 7
This is number 8
This is number 9
This is number 10

這是你想要的。

你的問題並不完全清楚:我認為Donal Fellows可能給你正確的答案,但我想我可能會在你的文本中看到另一個潛伏的問題,即:我怎樣才能編寫一個通用的命令,就像它一樣,短暫旋轉的變量?

如:

set b 1

myLoop b {
    set a $b
    puts "This is number $a"
}
puts "Again, this is number $a"

你會像這樣寫myLoop

proc myLoop {varName body} {
    upvar 1 $varName i
    for {} {$i < 11} {incr i} {
        uplevel 1 $body
    }
}

請注意,這不是編寫這樣的命令的最佳方法:我這樣寫它是為了適應您的示例代碼。

該命令通過調用uplevel來在調用者的上下文中評估body中的腳本,無論哪個。 為了允許myLoop操作腳本中的變量,我們需要設置一些東西,以便命令與調用者共享變量。 upvar命令就是這樣做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM