2010-11-27 5 views
12

¿Es normal que los métodos con un signo de interrogación para devolver algo que es Truthy (por ejemplo, un número) para indicar que algo es verdad, o debería true ser devuelto a sí misma?En ruby, ¿la veracidad es idiomática para un nombre de método que termina con un signo de interrogación?

¿Hay ejemplos de truthiness que se utilizan en la biblioteca estándar de Ruby o Rails, por ejemplo?

Antecedentes: Alguien escribió un método String#int? en an answer to a separate question, que devuelve un número entero para representar cierto, y nil para representar falsa. Otro usuario se sorprendió al no devolver un booleano.

+3

El ejemplo que citas no estaba siguiendo la convención, que debería haber devuelto un verdadero booleano. –

+0

Heh, vi esa discusión, y me pregunté si esa respuesta llevaría a esta pregunta. :-) Buena captura @Andrew Grimm –

+0

@ Adam: ¿No es esa una respuesta, no es un comentario? (¡Normalmente me quejo de personas que hacen lo opuesto!) –

Respuesta

6

Es habitual para los métodos que terminan con ? para regresar ya sea true o false pero no es sistemático y ningún método núcleo asumirá él.

Un ejemplo en las clases principales es Numeric#nonzero? que nunca se rendimientos true o false.

42.nonzero? # => 42 

Set La biblioteca tiene add? y delete? también. Deseo Enumerable#one? regresaron nil o false para distinguir los casos en que el recuento es cero desde cuando es mayor que uno.

Un ejemplo similar son los operadores de comparación (<, >, ...), que por lo general sólo se devuelven true o false. También en este caso existen excepciones para los operadores Module 's que devolverán nil lugar cuando los dos módulos no están relacionados:

Array > Enumerable # => false 
Array > Fixnum  # => nil 
+0

Heckle también utiliza [lógica ternaria] (http://en.wikipedia.org/wiki/Ternary_logic) internamente - IIRC 'true' significa que un método es a prueba de heckle,' false' significa que no es, y 'nil' significa que no tiene nada que molestar. –

8

Adición de una? a un nombre de método en Ruby es idiomático que el método devolverá verdadero o falso. Object#nil? es un buen ejemplo. De hecho, Object tiene muchos buenos ejemplos de verificaciones de veracidad.

2

Hay dos respuestas a su pregunta, y ambos son válidos:

Técnicamente, nada de volver a false o nil actos de valor como un valor lógico falso cuando se hace una prueba condicional, al igual que un no-nula o true valor actúa como un verdadero Por lo tanto, el método en cuestión funcionará correctamente la mayoría de las veces que desee saber si algo es un número entero.

Pero estilísticamente un método que termina con '?' debe devolver un booleano true o false y solo esos.

El método en cuestión realmente no funciona bien con nuestras expectativas y falla el POLS ("principio de menor sorpresa") porque se puede esperar razonablemente que se devuelva un valor booleano, y obtener un entero o nulo. ESO podría llevar a sorpresas desagradables en el código cuando falla con un nil inesperado o un valor Fixnum.

Por lo tanto, si bien es un método válido, no es un buen método, y lo habría mencionado en una revisión del código. Y eso lleva a una discusión por separado de cómo cosas tan sutiles como esa pueden mejorar o dañar el mantenimiento del código, pero esa es una discusión completamente diferente.

2

Me cambió el nombre del método en cuestión para eliminar el ?, que era realmente importante a la pregunta que se contesta. Al escanear las funciones principales que terminan en "s", las únicas que detecté que devolvieron datos o que fueron nulas fueron los métodos add? y delete? en Establecer.

+0

Quité mi comentario de su respuesta: estaba equivocado. Gracias por la lección! –

Cuestiones relacionadas