【问题标题】:TCL. How to check if procedure exists?TCL。如何检查程序是否存在?
【发布时间】:2014-04-14 12:55:13
【问题描述】:

我需要检查过程 func1 是否存在并将结果(如果存在 1 如果不存在 0)放入 variable proc_ststus_var 。我该怎么做?

【问题讨论】:

    标签: tcl


    【解决方案1】:

    info procs ?pattern? 将为您提供所需的基本构建块:

    % proc foo {} {}
    % info procs foo
    foo
    % info procs bar
    % 
    

    类似:

    % proc procExists p {
       return uplevel 1 [expr {[llength [info procs $p]] > 0}]
    }
    % procExists foo
    1
    % procExists bar
    0
    

    【讨论】:

    • 谢谢。现在我知道了:)
    • 请注意,上面的代码使用了一个模式,也就是说,procExists fo* 将返回 true。如果您不希望出现这种行为,请在info procs 直接返回的列表中查找确切名称。
    • 请注意,在过程中运行info procs 可能会更改上下文命名空间;库质量代码将使用; uplevel 1 [list info procs $p] 代替。
    • info procs 可能有副作用?有没有这样的例子?
    • 在@Donal Fellows 的评论之后添加了uplevel 1
    【解决方案2】:

    请注意,如果您检查是否存在具有某些元字符(*?)的过程,info commands 可能会返回错误的结果。

    所以要检查过程是否存在,请使用namespace which 或检查info commands 的结果:

    if {[llength [namespace which $cmdname]]} {
        ...
    }
    if {$cmdname in [info commands $cmdname]} {
        ...
    }
    

    Tcl 的unknown 使用namespace which 方法。

    【讨论】:

      【解决方案3】:

      你可以试试

      set commandExists [ info commands "mycommandname" ];
      

      【讨论】:

      • info commands 检查命令,而不是过程(实际上是命令的子类)。它还返回命令名称列表,而不是布尔值……
      猜你喜欢
      • 1970-01-01
      • 2011-05-10
      • 2011-08-02
      • 1970-01-01
      • 2016-06-18
      • 2010-10-30
      • 1970-01-01
      • 2011-02-06
      • 2011-08-02
      相关资源
      最近更新 更多