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?".
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
15
El signo de interrogación indica que el método devuelve un valor booleano. Ya respondió aquí:
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.
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!
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 loEnumerable#sort!
ordena en su lugar.ActiveRecord::Base#save
devuelve falso si no se pudo guardar, mientras queActiveRecord::Base#save!
genera una excepción.Kernel::exit
hace que una secuencia de comandos se cierre, mientrasKernel::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, seif number.zero?
lee como "si el número es cero", peroif number.zero
parece extraño.En su ejemplo, se
name.reverse
evalúa como una cadena invertida, pero solo después de laname.reverse!
línea laname
variable realmente contiene el nombre invertido.name.is_binary_data?
parece "¿sonname
datos binarios?".fuente
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?
fuente
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.fuente
En contraste con, supongo, la mayoría de los lenguajes de programación ...
De: http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/ , sección Nombres de métodos divertidos
fuente
?
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!
fuente