1
我想知道如何在tcl中实现GOTO。 我正在写一个测试案例,我说5个步骤。 如果我的第一步失败了,我不想继续下去,我想跳过现有的东西并转到一个共同的清理部分。如何在tcl中实现goto
如果在tcl中有任何GOTO命令,请帮助我。
谢谢, Ramya。
我想知道如何在tcl中实现GOTO。 我正在写一个测试案例,我说5个步骤。 如果我的第一步失败了,我不想继续下去,我想跳过现有的东西并转到一个共同的清理部分。如何在tcl中实现goto
如果在tcl中有任何GOTO命令,请帮助我。
谢谢, Ramya。
Tcl中有nogoto
,由于相对技术上的原因,不可能实现一个。
但是你可以通过其他方式做你想做的事。既然你正在处理测试用例,我希望你使用tcltest
包作为工作。就这样,你可以指定清理代码很容易:
tcltest::test test-1.1 "verify that the foo works" -setup {
allocate some resources
} -body {
whatever to do the test...
return [our results]
} -cleanup {
drop those resources
make sure that we are nice and clean
} -result "the expected test result"
你可以只是做了return
跳过了测试的身体很容易; tcltest::test
命令将检测到它并将其视为结果。通常尽量保持每个测试独立于其他测试通常会更好:这样可以更轻松地找出测试失败时发生的问题。
如果您不使用tcltest
,那么您仍然可以最好地重构一些可以使用return
提前跳过的东西。您可以结合起来,与try…finally…
(无论是本地使用Tcl 8.6,或this code on the Tcler's Wiki)让一切变得简单:
proc doThings {} {
try {
# do thing-1
if {$no_more} return
# do thing-2
if {$no_more} return
# do thing-3
if {$no_more} return
# do thing-4
if {$no_more} return
# do thing-5
} finally {
# do cleanup
}
}
真正块'goto'是,它很难得到陈述权的标签问题 - 而我们可以处理异常冒出的块中的标签,当前不在执行上下文中的子块中的任何标签都将不可见 - 如果没有这些标签,则实际上根本无法到达任何位置;可能会为内置命令添加特殊情况,但会违背语言的精神。尽管如此,其他更高级的句法结构也是可能的,所以在实践中不会感觉到'goto'的缺失。 –
或者你可以使用[TAL](http://wiki.tcl.tk/28070)来编写,但这不适合胆怯的人! –