如何测试 expr == 在字符串上的不当使用?
How to test for improper use of expr == on strings?
在 expr
中使用 ==
可能会导致同样符合双精度条件的字符串出现意外行为。一个例子是 if {$a == $b}
当 a=1.0 和 b=1 时。我想 ==
甚至适用于字符串 post 8.4 的原因是向后兼容尚未用 eq
替换它的脚本。
有没有一种(简单的)方法可以在运行时检测到这一点,并可能在测试期间发现所有错误使用?比如激活“严格”模式之类的?
Tcl,设计, 没有这么简单的检查方法。 (在 8.6 之后,有一个不受支持的命令,tcl::unsupported::representation
,它可以做部分检查,但它并没有真正做你想做的,尤其是文字。)真正的问题是在逻辑类型中-在 Tcl 系统中,字符串是所有其他值类型的超类型,因此所有其他值类型都可以序列化为字符串,并且保证可以工作(前提是您有足够的内存)。
但是有一些方法可以通过执行需要数字的操作来强制使用数字,最简单的可能就是在参数前面添加一元 +
:
if {+$x == +$y} { ...
可以使用 $x | 0
或 $x ^ 0
来强制使用整数。通常不需要强制执行与数字性不同的浮点性。如果您真的需要它,string is
有您需要的各种支票,但它们可能会很贵。
除非明确指出,否则上述所有内容适用于本千年以来的所有 Tcl 版本。
Tcl 中已知的运算符(&&、|| 和 ? : 除外)在 tcl::mathop 命名空间中可用。不幸的是,与 tcl::mathfunc 命名空间中的函数相反,重新定义 tcl::mathop::== 对 expr
处理 '==' 的方式没有影响。
恐怕除了更改 Tcl C 代码外,唯一的方法就是重新定义 expr
和其他将算术表达式作为参数的命令(如果, , 尽管)。解析表达式参数,将其分成两部分,放在 == 的两边,同时考虑优先顺序。然后将每个部分通过原始expr
并检查结果是否满足string is double -strict
.
这不是一个简单的练习,可能还会大大减慢脚本的执行速度。
在 expr
中使用 ==
可能会导致同样符合双精度条件的字符串出现意外行为。一个例子是 if {$a == $b}
当 a=1.0 和 b=1 时。我想 ==
甚至适用于字符串 post 8.4 的原因是向后兼容尚未用 eq
替换它的脚本。
有没有一种(简单的)方法可以在运行时检测到这一点,并可能在测试期间发现所有错误使用?比如激活“严格”模式之类的?
Tcl,设计, 没有这么简单的检查方法。 (在 8.6 之后,有一个不受支持的命令,tcl::unsupported::representation
,它可以做部分检查,但它并没有真正做你想做的,尤其是文字。)真正的问题是在逻辑类型中-在 Tcl 系统中,字符串是所有其他值类型的超类型,因此所有其他值类型都可以序列化为字符串,并且保证可以工作(前提是您有足够的内存)。
但是有一些方法可以通过执行需要数字的操作来强制使用数字,最简单的可能就是在参数前面添加一元 +
:
if {+$x == +$y} { ...
可以使用 $x | 0
或 $x ^ 0
来强制使用整数。通常不需要强制执行与数字性不同的浮点性。如果您真的需要它,string is
有您需要的各种支票,但它们可能会很贵。
除非明确指出,否则上述所有内容适用于本千年以来的所有 Tcl 版本。
Tcl 中已知的运算符(&&、|| 和 ? : 除外)在 tcl::mathop 命名空间中可用。不幸的是,与 tcl::mathfunc 命名空间中的函数相反,重新定义 tcl::mathop::== 对 expr
处理 '==' 的方式没有影响。
恐怕除了更改 Tcl C 代码外,唯一的方法就是重新定义 expr
和其他将算术表达式作为参数的命令(如果, , 尽管)。解析表达式参数,将其分成两部分,放在 == 的两边,同时考虑优先顺序。然后将每个部分通过原始expr
并检查结果是否满足string is double -strict
.
这不是一个简单的练习,可能还会大大减慢脚本的执行速度。