¿El equivalente de Applescript de & # 8220; continuar & # 8221 ;?
-
06-07-2019 - |
Pregunta
Tengo un simple 'repetir con' en un AppleScript, y me gustaría pasar al siguiente elemento en el " repetir " condicionalmente Básicamente estoy buscando algo similar a "continuar" (¿o descanso?) en otros idiomas.
No conozco bien AppleScript, pero lo he encontrado útil algunas veces.
Solución
Después de buscar este problema exacto, encontré esto extracto de libro en línea. Responde exactamente la pregunta de cómo omitir la iteración actual y saltar directamente a la siguiente iteración de un bucle repeat
.
Applescript tiene exit repeat
, que finalizará por completo un bucle, omitiendo todas las iteraciones restantes. Esto puede ser útil en un bucle infinito, pero no es lo que queremos en este caso.
Aparentemente, una función similar a continue
no existe en AppleScript, pero aquí hay un truco para simularla:
set aList to {"1", "2", "3", "4", "5"}
repeat with anItem in aList -- # actual loop
repeat 1 times -- # fake loop
set value to item 1 of anItem
if value = "3" then exit repeat -- # simulated `continue`
display dialog value
end repeat
end repeat
Esto mostrará los cuadros de diálogo para 1, 2, 4 y 5.
Aquí, ha creado dos bucles: el bucle externo es su bucle real, el bucle interno es un bucle que se repite solo una vez. El exit repeat
saldrá del bucle interno, continuando con el bucle externo: ¡exactamente lo que queremos!
Obviamente, si usa esto, perderá la capacidad de hacer una salida repetir
.
Otros consejos
set aList to {"1", "2", "3", "4", "5"}
repeat with anItem in aList -- # actual loop
try
set value to item 1 of anItem
if value = "3" then error 0 -- # simulated `continue`
log value
end try
end repeat
Esto todavía le dará la " salir repetir " posibilidad
set aList to {"1", "2", "3", "4", "5"}
repeat with anItem in aList -- # actual loop
try -- # needed to simulate continue
set value to item 1 of anItem
if value = "3" then continueRepeat -- # simulated `continue` throws an error to exit the try block
log value
on error e
if e does not contain "continueRepeat" then error e -- # Keeps error throwing intact
end try
end repeat
Basado en el enfoque basado en el bloque de prueba anterior, pero se lee un poco mejor. Por supuesto, dado que continueRepeat no está definido, se generará un error que hará que se omita el resto del bloque try.
Para mantener intacto el lanzamiento de errores, incluya la cláusula de error que arroja cualquier error inesperado.
- O podría usar una estrategia diferente: use el bucle a bucle y realice la lógica condicional en un controlador, de esta manera:
set aList to {"1", "2", "3", "4", "5"}
repeat with anItem in aList
doConditionalWork(anItem as string)
end repeat
on doConditionalWork(value)
if value = "3" then return
display dialog value
end doConditionalWork
Todos ustedes lo están complicando demasiado. Prueba esto:
set aList to {"1", "2", "3", "4", "5"}
repeat with anItem in aList
set value to item 1 of anItem
if value is not "3" then log value
end repeat
También puede usar & # 8220; repetir mientras & # 8221; para bucles que solo se repiten condicionalmente.