Cual es el proposito de "!" y "?" al final de los nombres de los métodos?


Respuestas:


160

Es "simplemente endulzado" para mejorar la legibilidad, pero tienen significados comunes:

  • Los métodos que terminan en !realizar algún cambio permanente o potencialmente peligroso ; por ejemplo:
    • Enumerable#sortdevuelve una versión ordenada del objeto mientras lo Enumerable#sort!ordena en su lugar.
    • En Rails, ActiveRecord::Base#savedevuelve falso si no se pudo guardar, mientras que ActiveRecord::Base#save!genera una excepción.
    • Kernel::exithace que una secuencia de comandos se cierre, mientras Kernel::exit!que lo hace inmediatamente, sin pasar por los controladores de salida.
  • Los métodos que terminan en ?un valor booleano , lo que hace que el código fluya de manera aún más intuitiva como una oración, se if number.zero?lee como "si el número es cero", pero if number.zeroparece extraño.

En su ejemplo, se name.reverseevalúa como una cadena invertida, pero solo después de la name.reverse!línea la namevariable realmente contiene el nombre invertido. name.is_binary_data?parece "¿son namedatos binarios?".


22
Una nota importante es que solo debe tener un método de explosión si también tiene un método correspondiente que no sea de explosión. La explosión se utiliza para distinguir la versión "más sorprendente" del método de la "menos sorprendente". Si solo tiene un método, entonces no es necesario hacer una distinción, y no debe nombrarlo con una explosión. Ver Array#clear, por ejemplo. Borra la matriz. Limpiar la matriz la muta de forma natural. No hay nada de sorprendente en eso, el nombre ya lo deja claro, por lo tanto: no bang. Consulte ruby-forum.com/topic/176830#773946 .
Jörg W Mittag

2
Agregando a lo que @ JörgWMittag dijo, de acuerdo con la Guía de estilo de Ruby : Los nombres de métodos potencialmente peligrosos (es decir, métodos que se modifican a sí mismos o los argumentos, ¡salir! (No ejecuta los finalizadores como lo hace la salida, etc.) deben terminar con un signo de exclamación si existe una versión segura de ese método peligroso .
Tod Birdsall

2
Cuidado, este no es siempre el caso. Por ejemplo, Ruby Array # concat docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat . Donde puede quemarse mucho es algo como MyActiveRecordModel.column_names.concat (...). En su lugar, debes clonarlo antes de hacer la concat.
wintondeshong


8

En Ruby, ?significa que el método devolverá un valor booleano y !modificará el objeto al que se llamó. Están ahí para mejorar la legibilidad al mirar el código.


5

En contraste con, supongo, la mayoría de los lenguajes de programación ...

Ruby, los métodos pueden terminar con signos de interrogación o exclamación.

Por convención, los métodos que responden preguntas (es decir, ¿Array # vacío? Devuelve verdadero si el receptor está vacío) terminan en signos de interrogación.

Los métodos potencialmente "peligrosos" (es decir, los métodos que modifican self o los argumentos, salir, etc.) por convención terminan con signos de exclamación.

De: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , sección Nombres de métodos divertidos


1
También los métodos que terminan en ?se denominan métodos de predicado.
Waseem

1

Cuidado, este no es siempre el caso. Tomemos, por ejemplo, Ruby Array # concat http://docs.ruby-lang.org/en/2.0.0/Array.html#method-i-concat .

Donde puedes quemarte gravemente es algo así como MyActiveRecordModel.column_names.concat([url]). Las llamadas posteriores relacionadas con MyActiveRecordModel intentarán buscar una columna de 'url' para MyActiveRecordModel y lanzar.

En su lugar, debes clonarlo antes de hacer la concat. Afortunadamente, mi suite de pruebas captó este, pero ... ¡aviso!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.