对此很困惑:
$ tclsh
% string is double {}
1
为什么tcl会将空字符串视为有效的双精度?
答案 0 :(得分:1)
摘要:有点设计不当,最初的用例是一个错误的地方,但是我们无法在8中进行更改。*(我不确定关于Tcl 9.0;我们仍然希望避免在此处进行无偿更改)。
string is
命令最初旨在支持Tk entry
小部件的验证选项。这些使小部件通过检查更改是否使小部件处于有效状态(例如保持整数)来响应键入(或焦点更改)。如果您愿意,可以这样做:
entry $w -validate key -vcmd {string is integer %P} -invcmd {bell}
然后,如果您按下字母键,例如 A ,并且光标位于整数的中间,则该编辑将被拒绝,并且系统会发出警告声。真的很容易。
只有一个小问题。如果您已选择了条目中的所有文本并按了一个数字,则 也会被拒绝(如果string is
默认是严格的)。问题在于,编辑中存在一个中间过渡状态,其中删除了旧文本,但在插入新文本之前:在这种情况下,验证发生两次,一次是delete
然后一次用于insert
。 (由于事物是在幕后捆绑在一起的,因此必须采用这种方式。)这是一种 糟糕 的用户体验,因此string is
的懈怠是默认,以便此用例可以正常工作。
这不是我同意的决定-应该是相反的选择,如果需要的话,您需要在测试中要求宽松,这会增加很少的开销,同时允许其他用途更合理-但那时我只是普通用户。我更喜欢在表单中使用多阶段验证,例如将按键级别验证用作软验证,以便在用户使用表单的过程中允许错误的输入,并且仅表明它知道仍然存在问题,通过调整背景颜色和禁用提交按钮等技术。 (但这是您提出的问题……)
库命令设计很棘手。它会仔细考虑用例,以确保正确。有时候我们失败了。
问题起源于大约Tcl 8.1.0左右的Tcl和Tk外部代码。引入此补丁的补丁的 Most 非常好(它还为我们提供了string equal
和string map
之类的命令),但这是一个可以多做一点的方面烹饪。