【问题标题】:Is there a way to make a dictionary global in TCL 8.4有没有办法在 TCL 8.4 中使字典全局化
【发布时间】:2015-04-25 06:19:26
【问题描述】:

我在一个过程中的 tcl 8.4 中构建了一个字典。如何在另一个过程中使用构建的字典。我添加了如何在 tcl 8.4 中构建字典的示例代码。我知道 tcl 8.5 有内置的 'dict' 选项,但我必须使用 tcl 8.4。

proc a {} {
    set test(key1) "value1"
    set test(key2) "value2"
    lappend keylist "key1"
    lappend keylist "key2"
    foreach key $keylist {
            puts "value of $key is $test($key)"
    }
}

所以上面提到的过程建立了一个字典。但是由于 tcl 8.4 解释器将每一行 "$test($key)" 解释为一个单独的变量,我怎样才能使它成为全局变量,以便我可以在另一个过程中使用它。

【问题讨论】:

  • 如果可以的话,你真的应该升级到 8.5 或 8.6;即使是安全性或构建修复,也不再支持 8.4...

标签: dictionary tcl


【解决方案1】:

您可以使用global 命令将变量或数组设为全局变量。

例如:

proc a {} {
    global test
    set test(key1) "value1"
    set test(key2) "value2"
    lappend keylist "key1"
    lappend keylist "key2"
    foreach key $keylist {
        puts "value of $key is $test($key)"
    }
}

a

# Outputs
# value of key1 is value1
# value of key2 is value2

# Now use them in another proc...
prob b {} {
    global test
    puts $test(key1)
    puts $test(key2)
}

b

# Outputs
# value1
# value2

【讨论】:

  • 这很棒。我想我要操作一个全局变量,我应该首先在过程之外声明它。(更像是在 C 中)这总是以错误结束。
  • 如果您愿意,您可以先在过程之外做一些事情,但您仍然必须明确地将这些事情带入范围。 (或者您可以使用完全限定的变量名称;尽管它们在多次使用时会带来一些性能损失。)
【解决方案2】:

如果您能够返回字典,您可以将它作为参数传递给另一个 proc。 (本来希望将其放在评论部分,但我没有所需的代表)

【讨论】:

  • 我认为这是可能的,因为字典是指键值对的集合。但是由于 tcl 8.4 不将结构视为字典,因此它在返回时保留“值”部分,但不保留“键”部分(因为它只是变量)。此外,通过这样做,我们只能返回一个值,并且集合会丢失。
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 2010-11-20
  • 2020-06-29
  • 1970-01-01
相关资源
最近更新 更多