2012-05-10 3 views
27

creo que es de sentido común y de la convención de Ruby para hacer esto, pero tengo este método:¿Debería terminar un método en? (signo de interrogación) ¿devuelve solo un booleano?

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

La única confusión que estoy recibiendo es, esto no devuelve booleano como yo había previsto originalmente por plantear la cuestión marca al final del nombre del método. Tenía la impresión de que al evaluar un objeto como condicional, devuelve true si no es nil.

Aparentemente me falta el punto aquí y no lo estoy evaluando como pensaba.

Entonces, mi pregunta es, ¿sería mejor simplemente hacer un if (condition) true else false? ¿O hay un método más elegante para hacer esto?

Respuesta

27

Un método que termina con? debe devolver un valor que se puede evaluar como verdadero o falso. Si desea garantizar un retorno booleano, puede hacerlo agregando un doble golpe al buscador.

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

genial justo lo que estaba buscando. –

+6

Como un aparte, tal vez el método debe ser nombrado como "suscrito?". "¿?" ya transmite la sensación de "es". – Salil

+2

"un valor que se puede evaluar como verdadero o falso", pero todos y cada uno de los valores de Ruby se evalúan como "verdadero" o "falso" ... –

5

Debería un valor 'Truthy' o 'Falsy', que puede ser utilizado con seguridad en predicados, pero no tiene que volver literal true o false. Incluso hay métodos como este, como File.size?, en la biblioteca estándar.

2

En realidad, para ser específicos, los métodos que terminen en un signo de interrogación deben arrojar valores que puedan probarse como true o false.

Hay muchos métodos en rieles que devuelven valores no booleanos de '?' métodos.

De hecho, había recientemente una solicitud de extracción presentado al proyecto de rieles que se centró la atención en este asunto exacta:

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

Básicamente, la discusión fue en torno a este problema exacto - métodos sólo necesitan volver valores que se pueden probar como verdaderos o falsos, como sigue:

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

Desde esa perspectiva, creo que su método está bien.

14

Adición de un ? al final de un nombre de método no implica, en modo alguno alterará el valor de retorno del método, sino que sólo indica que se trata de un método predicado. Es decir, que el valor de retorno del método se debe tratar como booleano, pero no necesita ser estrictamente booleano (es decir, true o false).

Muchas de las otras respuestas afirman que debe devolver un valor que sea sincero o falso. Esto es bastante redundante, ya que todo puede ser truey o falsy, y dado que todos los métodos en Ruby devuelven algo (a menos que presenten una excepción), el valor devuelto es siempre true o false.

Piense en anexar un ? como una mejor alternativa que anteponer is_ en otros idiomas; p.ej. Yo tendría subscribed? o is_subscribed.

Cuestiones relacionadas