2010-02-23 3 views
179

J'ai une tâche de rake où je fais des vérifications au début, si l'une des vérifications échoue je voudrais retourner tôt de la tâche rake, je ne veux pas exécuter le code restant.Comment revenir tôt d'une tâche râteau?

Je pensais que la solution serait de placer un retour où je voulais revenir à partir du code, mais je reçois l'erreur suivante

unexpected return 

Répondre

223

Une tâche Rake est essentiellement un bloc. Un bloc, à l'exception de lambdas, ne supporte pas le retour, mais vous pouvez passer à l'instruction suivante en utilisant next qui dans une tâche rake a le même effet que l'utilisation de return dans une méthode.

task :foo do 
    puts "printed" 
    next 
    puts "never printed" 
end 

Vous pouvez également déplacer le code dans une méthode et utiliser return dans la méthode.

task :foo do 
    do_something 
end 

def do_something 
    puts "startd" 
    return 
    puts "end" 
end 

Je préfère le deuxième choix.

+14

J'aime le second meilleur, aussi. Plus j'utilise rake, plus j'aime garder du code non trivial en dehors de la définition de tâche. Pas une règle 100% ferme, mais semble être une bonne ligne de conduite pour travailler. –

+0

Je suis absolument d'accord. En outre, les méthodes sont beaucoup plus faciles à tester. –

+1

La deuxième solution est plus agréable. Dans votre première solution, je préférerais utiliser break au lieu de next pour sortir du bloc ... Devrait travailler aussi, n'est-ce pas? – severin

145

Vous pouvez utiliser abort(message) depuis l'intérieur de la tâche pour abandonner cette tâche avec un message.

+0

Abort est donc un moyen spécifique à rake pour quitter une tâche plus tôt? C'est utile à savoir ... –

+5

@TylerRick Non, c'est [Kernel # abort] (http://www.ruby-doc.org/core-1.9.3/Kernel.html#method-i-abort). –

+4

De cette manière, il est préférable de quitter le système en cas de non-succès car il définit automatiquement le statut de sortie. – samuil

7

Si vous vouliez dire quitter une tâche de rake sans provoquer le "rake aborted!" message à imprimer, alors vous pouvez utiliser "abandonner" ou "quitter". Mais "abort", lorsqu'il est utilisé dans un bloc de secours, termine la tâche et imprime l'erreur entière (même sans utiliser --trace). Donc "exit" est ce que j'utilise.

+1

En général, je pense que l'utilisation de "exit" au lieu de return/break est une mauvaise idée car elle ne se contente pas de sauter de la méthode * proc/current/etc. - il quitte tout le processus et ignore tout code que la méthode de l'appelant aurait pu exécuter par la suite (y compris éventuellement un nettoyage). Mais pour une tâche de rake, je suppose que ce n'est probablement pas un problème ... –

9

J'ai tendance à utiliser abort qui est une meilleure alternative dans de telles situations, par exemple:

task :foo do 
    something = false 
    abort 'Failed to proceed' unless something 
end 
+0

Bonne réponse! Exactement ce que je cherchais.. – levelone

Questions connexes