ruby - usa - ¿Debería un método terminar en?(signo de interrogación) devolver solo un booleano?
signos de interrogacion y exclamacion ejemplos (4)
Creo que es solo sentido común y convención de Ruby hacer esto, pero tengo este método:
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 obteniendo es que esto no se vuelve booleano como anticipé originalmente al poner el signo de interrogación al final del nombre del método. Tenía la impresión de que al evaluar un objeto como condicional, devuelve true
si no nil
.
Aparentemente me estoy perdiendo el punto aquí y no lo estoy evaluando como pensé.
Entonces, mi pregunta es, ¿sería mejor simplemente hacer una if (condition) true else false
? ¿O hay un método más elegante de hacer esto?
Añadiendo un ?
hasta el final de un nombre de método no cambia de ninguna manera el valor de retorno del método, sino que solo indica que es un método de predicado . Es decir, que el valor de retorno del método debe tratarse como un valor 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 verdadero o falso. Esto es bastante redundante, ya que todo puede ser verdadero o falso, y dado que todos los métodos en Ruby devuelven algo (a menos que generen una excepción), el valor de retorno es siempre verdadero o falso.
Piensa en añadir una ?
como una alternativa más agradable a is_
en otros idiomas; Por ejemplo, ¿me habría subscribed?
o is_subscribed
.
Debería ser un valor ''verdadero'' o ''falso'', que se pueda usar de manera segura en predicados, pero que no tenga que devolver literalmente true
o false
. Incluso hay métodos como este, como File.size?
, en la biblioteca estándar.
En realidad, para ser específicos: los métodos que terminan en un signo de interrogación deben devolver valores que pueden probarse como true
o false
.
Hay muchos métodos en los rieles que devuelven valores no booleanos desde ''?'' metodos
De hecho, recientemente se envió una solicitud de extracción al proyecto de Rails que centró la atención en este asunto exacto:
https://github.com/rails/rails/pull/5582
Básicamente, la discusión giró en torno a este problema exacto: los métodos solo necesitan devolver valores que puedan probarse como verdaderos o falsos, de este modo:
if (condition)
# do ''truthy option
else
# do non-truthy option
end
Desde esa perspectiva, creo que tu método está bien.
Un método que termina con? debe devolver un valor que se puede evaluar como verdadero o falso. Si desea garantizar una devolución booleana, puede hacerlo agregando un doble bang 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