【问题标题】:Test if matrix object exists in TCL测试 TCL 中是否存在矩阵对象
【发布时间】:2019-04-16 15:05:42
【问题描述】:

我想测试一个tcl-matrix 对象是否存在。我该怎么做?

以下代码不起作用。

package require struct::matrix

# Test (now we expect 0)
info exists m
# Create the object
struct::matrix m

# Test again, now I expect 1, however it returns 0!!!
info exists m

【问题讨论】:

    标签: tcl exists


    【解决方案1】:

    使用info commands 测试矩阵对象是否存在。 info exists 测试变量的(不)存在。

    % package req struct::matrix
    2.0.3
    % info commands m
    % struct::matrix m
    ::m
    % info commands m
    m
    

    背景

    一个矩阵对象被实现为一个 Tcl 命令(准确地说是一个别名命令)加上每个矩阵的 Tcl 命名空间(作为存储)。

    或者,但这在很大程度上取决于当前的实现,您可以测试是否存在所谓的命名空间:

    % package req struct::matrix
    2.0.3
    % namespace exists m
    0
    % struct::matrix m
    ::m
    % namespace exists m
    1
    

    例如,当矩阵对象被重新实现为 TclOO 对象时,该命令的测试也将继续工作。

    【讨论】:

    • 是否有合理的方法来询问命令是struct::matrix 还是我们在这里说的是鸭子打字?
    【解决方案2】:

    略过the struct::matrix source code:

    % package req struct::matrix
    2.0.3
    % set m [struct::matrix]
    ::matrix1
    % expr {$m in [interp aliases]}
    1
    % string first MatrixProc [interp alias {} $m]
    18
    % proc is_matrix {name} {
        expr {
             $name in [interp aliases] &&
             [string first MatrixProc [interp alias {} $name]] != -1
        }
    }
    % is_matrix $m
    1
    

    如果您使用struct::matrix m 形式,那么请使用完全限定的::m 而不是$m

    % struct::matrix m
    ::m
    % is_matrix m
    0
    % is_matrix ::m
    1
    

    【讨论】:

    • 显然,这需要了解 struct::matrix 的当前实现。如果它在将来的某个 tcllib 版本中发生更改,则此答案无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-21
    • 2012-11-05
    相关资源
    最近更新 更多