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