A veces veo métodos en Ruby que tienen "?" y "!" al final de ellos, por ejemplo:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Me preguntaba cuál es su propósito. ¿Son solo un revestimiento de sintaxis?
A veces veo métodos en Ruby que tienen "?" y "!" al final de ellos, por ejemplo:
name = "sample_string"
name.reverse
name.reverse!
name.is_binary_data?
Me preguntaba cuál es su propósito. ¿Son solo un revestimiento de sintaxis?
Respuestas:
Es "simplemente endulzado" para mejorar la legibilidad, pero tienen significados comunes:
!
realizar algún cambio permanente o potencialmente peligroso ; por ejemplo:
Enumerable#sort
devuelve una versión ordenada del objeto mientras lo Enumerable#sort!
ordena en su lugar.ActiveRecord::Base#save
devuelve falso si no se pudo guardar, mientras que ActiveRecord::Base#save!
genera una excepción.Kernel::exit
hace que una secuencia de comandos se cierre, mientras Kernel::exit!
que lo hace inmediatamente, sin pasar por los controladores de salida.?
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.zero
parece extraño.En su ejemplo, se name.reverse
evalúa como una cadena invertida, pero solo después de la name.reverse!
línea la name
variable realmente contiene el nombre invertido. name.is_binary_data?
parece "¿son name
datos binarios?".
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 .
El signo de interrogación indica que el método devuelve un valor booleano. Ya respondió aquí:
¿Qué significa el operador de signo de interrogación en Ruby?
La explosión indica que el método actúa sobre el objeto en sí. Ya respondió aquí:
¿Por qué se utilizan signos de exclamación en los métodos Ruby?
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.
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
?
se denominan métodos de predicado.
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!