[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 obrender
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