2012-05-10 6 views
27

Ich denke, es ist nur der gesunde Menschenverstand und Ruby-Konvention, dies zu tun, aber ich habe diese Methode:Sollte eine Methode enden? (Fragezeichen) gebe nur einen booleschen Wert zurück?

def is_subscribed?(feed_url) 
    Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url)) 
end 

Die einzige Verwirrung Ich bin immer ist, diese boolean nicht zurück, wie ich, indem sie die Frage erwartet ursprünglich Markieren Sie das Ende des Methodennamens. Ich hatte den Eindruck, dass bei der Bewertung eines Objekts als bedingt true zurückgegeben wird, wenn nicht nil.

Offenbar vermisse ich den Punkt hier und es bewertet es nicht, wie ich dachte.

Also, meine Frage ist, wäre es am besten, nur eine if (condition) true else false zu tun? Oder gibt es eine elegantere Methode, dies zu tun?

Antwort

27

Eine Methode endet mit? sollte einen Wert zurückgeben, der als wahr oder falsch bewertet werden kann. Wenn Sie eine boolesche Rückgabe sicherstellen möchten, können Sie dies tun, indem Sie dem Finder einen doppelten Knall hinzufügen.

def is_subscribed?(feed_url) 
    !!Subscription.find_by_user_id_and_feed_id(self[ :id ], Feed.find_by_feed_url(feed_url)) 
end 
+0

großartig genau das, was ich gesucht habe. –

+6

Nebenbei, vielleicht sollte die Methode als "abonniert?" "?" vermittelt bereits den Sinn von "ist". – Salil

+2

"ein Wert, der zu wahr oder falsch ausgewertet werden kann", aber jeder und jeder Wert in Ruby wird zu 'true' oder' false' ausgewertet ... –

5

Es sollte ein ‚truthy‘ oder ‚falsy‘ Wert, die sicher in Prädikate verwendet werden kann, muss aber nicht wörtlich true oder false zurückzukehren. Es gibt sogar solche Methoden wie File.size? in der Standardbibliothek.

2

Eigentlich, um genau zu sein - Methoden, die in einem Fragezeichen enden, sollten Werte zurückgeben, die als true oder getestet werden können.

Es gibt viele Methoden in Schienen, die nicht-boolesche Werte von '?' Methoden.

In der Tat gibt es in letzter Zeit eine Pull-Anforderung an die Schienen Projekt eingereicht wurde, die Aufmerksamkeit auf genau diese Frage konzentriert:

https://github.com/rails/rails/pull/5582

Grundsätzlich ist die Diskussion war um diese genaue Ausgabe - Methoden müssen nur zurück Werte, die als richtig oder falsch getestet werden können, wie folgt:

if (condition) 
    # do 'truthy option 
else 
    # do non-truthy option 
end 

Aus dieser Perspektive glaube ich, dass Ihre Methode in Ordnung ist.

14

ein ? bis zum Ende eines Verfahren Namen ändern gibt den Rückgabewert des Verfahrens, sondern nicht in irgendeiner Weise Hinzufügen nur, dass es eine Prädikat Methode ist. Das heißt, dass der Rückgabewert der Methode als boolescher Wert behandelt werden soll, aber nicht unbedingt boolesch sein muss (d. H. true oder).

Viele der anderen Antworten geben an, dass es einen Wert zurückgeben soll, der truthy oder falsy ist. Dies ist ziemlich überflüssig, da alles entweder truthy oder falsy sein kann, und da alle Methoden in Ruby etwas zurückgeben (außer sie eine Ausnahme auslösen), ist der Rückgabewert immer truthy oder falsy.

Denken Sie an eine ? als eine bessere Alternative zu is_ in anderen Sprachen anfügen; z.B. Ich hätte entweder subscribed? oder is_subscribed.

Verwandte Themen