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

breakand演算はcontinue、1レベルのループのみを実行します。それ以上が必要な場合は、リファクタリングを検討してくださいreturn。または、Tcl8.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 に答える
4

break最も内側のループの最後にのみジャンプし、Tclには。がありませんgoto。ただしreturncatchまたは同様の内部にない限り、最後にジャンプするようなプロシージャを終了します。したがって、最も外側のループをプロシージャの最後のコマンドにすると(コードがトップレベルの場合、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 に答える