2010-08-26 6 views
4

J'essaie de vérifier si un texte a été écrit dans un fichier (build.log) après l'exécution d'une tâche de rake qui lancera une exception. Checkout à la fois les extraits de code ci-dessous, celui avec begin fonctionne alors que lambda jette un message disant qu'il n'a pas pu trouver le fichier build.log.Quelle est la différence entre lambda et begin block?

Utiliser commencent à tester. (Travaux)

begin 
    Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log 
    rescue 
    end 
    IO.read(@[email protected]_id+"/build.log").should match(/.*destination.*already.*exists.* /) 

Essayer de tester la même chose en utilisant lambda. (Pas fonctionne)

lambda { 
    Rake::Task['git:checkout'].invoke //writes "destination already exists" to build.log 
    } 
    IO.read(@[email protected]_id+"/build.log").should match(/.*destination.*already.*exists.* /) 

Quelle est la différence entre ces deux?

Répondre

5

Vous pensez incorrectement à lambda. Un lambda est une suspension de code exécutable. Je dis suspendu, parce qu'il est prêt à fonctionner, même prêt à prendre des arguments, mais il n'a pas encore fait rien encore.

Par exemple, considérons la spécification (passant) suivante:

flag = false 
x = lambda {   # Here, we suspend a function to set our flag. 
    flag = true 
} 

flag.should == false # The code in the lambda is still suspended; 
         # it hasn't done any work. 

x.call     # Now we ran the suspended function. 
flag.should == true 

avis deux choses:

  1. j'ai reçu un objet sur le mot-clé lambda. Vous obtenez également cet objet, mais puisque vous ne l'attribuez pas à une variable, il est immédiatement perdu.
  2. J'ai utilisé la méthode call pour réellement exécuter le code dans la suspension (c'est-à-dire dans le lambda). Dans votre exemple, vous n'exécutez pas votre tâche git:checkout!

begin ... rescue ... end est un mécanisme complètement différent: le but est de gérer correctement (ou dans votre cas, d'avaler) les exceptions. Stick avec ce formulaire; c'est le seul qui fait ce dont vous avez besoin. :)

+0

Merci beaucoup. Votre réponse a clarifié ma confusion. – Muthu

Questions connexes