为什么 tcl 将空字符串视为双精度字符串?
Why does tcl consider an empty string a double?
对这个很困惑:
$ tclsh
% string is double {}
1
为什么 tcl 会将空字符串视为有效的双精度值?
总结:这是一个有点设计错误的地方,最初的用例是错误的,但我们不能在 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 的外部代码。 大部分引入这个的补丁都非常好(它还给了我们命令,例如string equal
和string map
)但这是一个可以完成的方面多做点菜。
对这个很困惑:
$ tclsh
% string is double {}
1
为什么 tcl 会将空字符串视为有效的双精度值?
总结:这是一个有点设计错误的地方,最初的用例是错误的,但我们不能在 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 的外部代码。 大部分引入这个的补丁都非常好(它还给了我们命令,例如string equal
和string map
)但这是一个可以完成的方面多做点菜。