【问题标题】:do we need to "unset" variables in TCL?我们需要在 TCL 中“取消设置”变量吗?
【发布时间】:2011-01-20 20:58:23
【问题描述】:

这是好的TCL代码的要求吗?如果我们不在脚本中使用“unset”关键字会发生什么?我应该知道哪些不良影响?

我继承了一些遗留代码,并且由于“未设置”不存在的变量而导致的错误让我陷入困境!

【问题讨论】:

    标签: tcl unset


    【解决方案1】:

    使用info exists 命令可以在使用变量之前确定它是否存在。请确保如果您不使用unset,请确保您不会在其他地方破坏程序的逻辑。

    unset 变量没有特定于 Tcl 的原因,也就是说,它不会导致内存泄漏或变量句柄用完或任何类似的疯狂。使用unset 可能是一种防御性编程实践,因为它可以防止将来使用不再相关的变量。在不了解您正在使用的确切代码的情况下,很难提供更详细的信息。

    【讨论】:

    • 没有内存泄漏或类似情况。正是我希望听到的!现在我可以在整个代码中禁止那些愚蠢的“未设置”。是的,现在看,对我来说似乎也更像是防御性编程。尽管如此,就我而言,它看起来有点“过多”的防守。 “信息存在”对我来说是新的 - 谢谢!
    【解决方案2】:

    除了其他回复,如果你的Tcl版本足够新,还可以使用:

    unset -nocomplain foo
    

    如果 foo 存在,它将取消设置,但如果不存在,则不会抱怨。

    【讨论】:

    • “足够新”涵盖了现在在野外的每个版本
    【解决方案3】:

    取决于系统统计信息,当您的脚本将大量数据存储到变量和数组中时,它可能会出现“无法分配字节”的问题。一旦缓存或 RAM 满了说“无法分配 XXXXXXXX 字节”,它就会中断。

    确保您没有将那么多数据存储到变量中,否则一旦使用结束,请取消设置各个数据集(变量)

    【讨论】:

      【解决方案4】:

      请注意,因为我似乎无法评论上面的“信息存在”;

      我经常使用这种形式..

      if { [info exists pie] && [$pie == "ThisIsWhatIWantInPie"]} {
          puts "I found what I wanted in pie."
      } else {
          puts "Pie did not exist; but I still did not error,TCL's evaluation \
                will see the conditional failed on the [info exists] and not \
                continue onto the comparison."
      }
      

      【讨论】:

        【解决方案5】:

        除了其他回复之外,我想补充一点,如果您想忽略由于取消设置不存在的变量而引发的错误,请使用“catch”。

        #!/bin/bash
        
        catch {unset newVariable}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-13
          • 1970-01-01
          相关资源
          最近更新 更多