2014-11-18 14 views
6

Diese Frage ist wenig kompliziert zu formulieren, aber ich werde mein Bestes geben. Durch unseren Code, den wir Schnipsel haben wieZurück vom Kontext über

response = do_something() 
return response unless response.ok? 

Ich war think Wrappermethode zu schreiben, die Notwendigkeit für diesen Schritt entfernen würde, und es wäre so etwas wie dies

def rr(&block) 
    response = yield 
    unless response.ok? 
    # somehow do return but in context above (magic needed here) 
    end 
    response 
end 

Danach sieht ich wäre in der Lage zu minimieren obigen Code von

response = rr { do_something() } 

scheint unmöglich zu sein, aber das ist Ruby so vielleicht gibt es einen Weg?

+1

Abgesehen von der Implementierung von 'rr', denke ich, dass Sie es wie folgt nennen müssen:' response = rr {do_something} '. – zwippie

+0

Danke, Sie haben Recht. –

Antwort

0

Möchten Sie nicht nur einen Wrapper schreiben, der genau das tut? Funktionell es scheint, Sie gerade nicht ok? Antworten ignorieren:

def rr 
    response = yield 

    response.ok? ? response : nil 
end 

Vielleicht etwas, das ich hier bin fehlt, aber ich sehe nicht, warum Sie eine return in einem anderen Kontext zu zwingen brauchen würde, um etwas, das nicht einmal ist Möglich sowieso.

+0

Die Implementierung ist nur ein Beispiel, ich habe auf etwas gehofft, das es mir erlauben würde, den Kontext wiederherzustellen. Wir haben Hunderte von Snippets in unserem Code, und ich suchte nach einer Möglichkeit zur Refactoring. –

+2

Sie brauchen ein anderes Muster. Ajedi32 weist darauf hin, dass Ausnahmen eine Form der Flusssteuerung darstellen, die Sie untersuchen möchten. – tadman

2

Die richtige Art und Weise über mehrere Schichten des Stapels zurück, wenn etwas schief geht (was, was Sie zu tun versuchen zu sein scheint) ist eine Ausnahme zu erhöhen:

class RequestFailedException < StandardError; end 

def rr(&block) 
    response = yield 
    unless response.ok? 
    raise RequestFailedException, "Response not okay: #{response.inspect}" 
    end 
    response 
end 

Verbrauch:

def do_lots_of_things() 
    rr { do_something } 
    rr { do_something_else } 
    rr { another_thing } 
end 

begin 
    do_lots_of_things 
rescue RequestFailedException => e 
    # Handle or ignore error 
end 
Verwandte Themen