[ruby] Anweisung and return



  • Wer schon mit Rails programmiert hat, hat bestimmt folgendes gesehen:

    def action_one
      if @something
          render :action => "some_action" and return
      end
      more code here
    end
    

    selbst in Büchern wird das so beigebracht. Ich habe mir bis jetzt keine Gedanken darüber gemacht, aber ich hab einen Bug in eine Rails Anwendung eingebaut und erst als es Kundenbeschwerden gab, bin ich drauf gekommen.

    Ich hatte so eine Funktion

    def something(purchase_order)
      return if purchase_order.empty?
    
      work with purchase_order
    end
    

    Ich wollte aber ein Paar Debug puts für die Logs haben:

    def check(purchase_order)
      puts "Purchase order empty -> aborting" and return if purchase_order.empty?
    
      work with purchase_order
    end
    

    aber das hat nicht funktioniert, "Purchase order empty -> aborting" wurde zwar ausgegeben, die check Methode hat aber weiter den Code ausgeführt, was zur einer Exception führte.

    Nun frage ich mich, ob render :action => "some_action" and return wirklich funktioniert, oder ob render von alleine Magie wirkt und es schafft, aus der aufrufenden Funktion zu springen.

    Wer hat schon Erfahrung damit gemacht?



  • Ersten ich mag kein Ruby weil die Fehlerbehandlung mist ist. Deswegen bin ich kein Ruby Experte.

    Aber du hasst ein semantischen Dreher? Willst du nicht?

    def something(purchase_order) 
      if purchase_order.empty? return 
    
      work with purchase_order 
    end
    

    ??



  • if purchase_order.empty? return
    

    ist leider falsche Syntax.

    In Ruby sind

    if purchase_order.empty? then return end
    

    und

    return if purchase_order.empty?
    

    äquivalent. Du kannst immer am Ende einer Anweisung eine Bedingung stellen (mit if oder unless), so dass die Anweisung nur dann ausgeführt wird, wenn die Bedingung erfüllt ist.

    Ich mag das, weil man dann manchal Code hat, der syntaktisch gleich ist wie man den Sachverhalt auf Englisch ausdrücken würde. 👍

    Aber mir ist gerade die Antwort wie Schuppen von den Augen eingefallen: puts liefert nil zurück! Wenn schon die erste Bedingung nicht erfüllt ist, dann kann der 'and' Ausdruck niemals erfüllt werden, also wird return nie ausgeführt.

    Oh Mann, 😡 ihr könnt mich Idiot des Tages für den Rest dieses Tages nennen 😃



  • supertux schrieb:

    Ich wollte aber ein Paar Debug puts für die Logs haben:

    puts "Purchase order empty -> aborting" and return if purchase_order.empty?
    

    supertux schrieb:

    puts liefert nil zurück!

    genau wie in C: "assert(i++);" ... den debug-teil musste immer getrennt halten!!

    supertux schrieb:

    Ich mag das, weil man dann manchal Code hat, der syntaktisch gleich ist wie man den Sachverhalt auf Englisch ausdrücken würde. 👍

    Ich glaube die Denkweise geht grundsätzlich in die Hose.
    Ruby scheint wie perl zu sein. Da bin ich auch schonmal darauf reingefallen und dachte, die Syntax kann man ja verstehen 🙄


Log in to reply