2

在下面的代码中,一旦我将 check_access 设为 0,我如何保留该值并点击下面的 if 条件 ($check_root && $check_access) 。Break 只会终止内部循环。但其他循环将按照我的方式继续。

   } else {
           set check_access 0
           break
         }
      }
   }
   if {$check_root && $check_access} {
    set result 1
  } else {
    set result 0
  }
4

2 回答 2

4

break仅跳转到最内层循环的末尾,并且 Tcl 没有goto. 但是return,除非它在 ​​acatch或类似的内部,否则退出一个过程,就像跳到它的末尾一样。因此,如果您将最外层循环设为过程的最后一条命令(如果您的代码是顶级代码,则必须先将其放入过程中才能使用 return),您可以将return其用作多断点。只需将循环后的命令移出过程并进入调用者的代码:

proc callMe {} {
  foreach ... {
    foreach ... {
      if ... {
        return
      }
    }
  }
  # move this code from here...
}

callMe
# ...to here

另一种方法是进行额外的测试:

set done 0
foreach ... {
  foreach ... {
    foreach ... {
      if ... {
        set done 1
        break
      }
    }
    if {$done} {break}
  }
  if {$done} {break}
}
于 2013-01-19T17:18:57.790 回答
4

breakandcontinue操作只进行一级循环。如果您需要更多,请考虑重构,以便您只需return. 或者,尝试 Tcl 8.6 中的自定义异常:

try {
    foreach a $longList1 {
        foreach b $longList2 {
            if {[someCondition $a $b]} {
                # Custom non-error exception
                return -level 0 -code 123
            }
        }
    }
} on 123 {} {
    # Do nothing; we're out of the loop
}
于 2013-01-19T13:16:57.793 回答