为什么TCL认为一个空字符串是双字符串?

为什么TCL认为一个空字符串是双字符串?,tcl,Tcl,对这一点很困惑: $ tclsh % string is double {} 1 为什么TCL认为空字符串是有效的双? 总结:这是一个有点设计错误的地方,最初的用例是错误的,但我们不能在8中更改它。*(我不确定Tcl 9.0;我们仍然希望避免在那里进行不必要的更改) string is命令最初设计用于支持Tk条目小部件的验证选项。这些允许小部件通过检查更改是否使小部件处于有效状态(例如保持整数)来响应键入(或焦点改变)。如果你想这样做,你可以这样做: entry $w -validate k

对这一点很困惑:

$ tclsh
% string is double {}
1

<>为什么TCL认为空字符串是有效的双? 总结:这是一个有点设计错误的地方,最初的用例是错误的,但我们不能在8中更改它。*(我不确定Tcl 9.0;我们仍然希望避免在那里进行不必要的更改)


string is
命令最初设计用于支持Tk
条目
小部件的验证选项。这些允许小部件通过检查更改是否使小部件处于有效状态(例如保持整数)来响应键入(或焦点改变)。如果你想这样做,你可以这样做:

entry $w -validate key -vcmd {string is integer %P} -invcmd {bell}

然后,如果你按下一个字母键,比如说,用光标在一个整数的中间,编辑就会被拒绝,系统会发出警告噪音。真的很容易

只有一个小问题。如果您选择了条目中的所有文本并按下了一个数字,则编辑也将被拒绝(如果
字符串默认为
严格)。问题在于编辑中存在一个中间转换状态,即删除旧文本,但在插入新文本之前:在这种情况下,验证会发生两次,一次用于
删除
,一次用于
插入
。(必须是这样,因为东西是在引擎盖下绑在一起的。)这是一种糟糕的用户体验,因此
字符串在默认情况下是松散的,这样这个用例就可以工作了

这不是一个我同意的决定-应该是相反的,如果你想要的话,你需要在测试中要求宽松,这会增加很少的开销,同时允许其他的使用更加合理-但我当时只是一个普通用户。我更喜欢在我的表单中使用多阶段验证,例如使用按键级别验证作为软验证,允许用户在使用表单的过程中输入错误信息,并通过调整背景颜色和禁用提交按钮等技术表明它知道问题仍然存在。(但这与你的问题无关……)

库命令设计很复杂。它会仔细考虑用例以获得正确的结果。有时我们会失败



这个问题起源于大约在Tcl 8.1.0时代Tcl和Tk外部的代码。引入此功能的大部分补丁都非常好(它还提供了诸如
stringequal
stringmap
等命令),但这是一个只需稍微烹饪一下就可以完成的方面。

问得好!这与历史原因有关,并且是Tcl设计中少数真正的错误之一。也许只需说明一个很好的解释:使用
-strict
模式,除非你知道所有的模糊是什么,即:
字符串是双重严格的$testedValue
。这可能不是OP的问题,但对于后续读者来说,这可能是他们正在寻找的。