¿Qué significa el operador de signo de interrogación en Ruby?

211

¿Cuál es el propósito del operador de signo de interrogación en Ruby?

A veces aparece así:

assert !product.valid?

a veces está en una ifconstrucción.

rtacconi
fuente
2
El signo de interrogación al final de una función no es un operador, es un carácter ordinario. El signo de interrogación junto con los dos puntos es un operador condicional ternario. El signo de interrogación en sí mismo es un operador de presupuesto unario. Ver stackoverflow.com/questions/16641205/…
Old Pro

Respuestas:

296

Es una convención de estilo de código; indica que un método devuelve un valor booleano.

El signo de interrogación es un carácter válido al final del nombre de un método.

chillitom
fuente
9
Gracias, pero ¿esta convención significa que solo hace la lógica o podría haber efectos secundarios? Es curioso cómo esto es una especie de truco alrededor de los idiomas escritos con el tipo de retorno en el código.
Jason
55
En este caso, es estrictamente una convención de nomenclatura de métodos. No se aplica un valor de retorno booleano. El hecho de que el nombre del método termine en un signo de interrogación no significa que el método deba devolver un valor booleano ... pero definitivamente debe devolver un valor booleano. Sin embargo, hay varios otros usos de ?in Ruby (es un operador ternario, que convierte un carácter a su entero ASCII, uso en test, en RegEx'es, etc.), muchos de los cuales están cubiertos en las otras respuestas aquí.
Karl Wilbur
44
@Jason FYI, incluso los idiomas fuertemente tipados tienen convenciones como esta. Por ejemplo, en métodos Java que devuelven un valor booleano a menudo llevan el prefijo "es", como en isEmpty(), isDigit(), etc. En Ruby, los mismos métodos sería escrito empty?, y digit?que es bastante más agradable bit OMI.
Ajedi32
3
Ajedi32 - Sí, estoy de acuerdo en que es bueno nombrar funciones así, las uso istodo el tiempo. Esto puede ser muy confuso para alguien que viene de Swift ya que el signo de interrogación no se utiliza para nullable:)
Jason
83

También tenga ?en cuenta que junto con un carácter, devolverá el código de carácter ASCII paraA

Por ejemplo:

?F # => will return 70

Alternativamente en ruby ​​1.8 puedes hacer:

"F"[0]

o en ruby ​​1.9:

"F".ord

También ?Ftenga en cuenta que devolverá la cadena "F", por lo que para acortar el código, también puede usar ?F.ordRuby 1.9 para obtener el mismo resultado que "F".ord.

Greg Osuri
fuente
29
En ruby ​​1.9 volverá'F'
klew
39

Es una convención en Ruby que los métodos que devuelven valores booleanos terminan en un signo de interrogación. No tiene más importancia que eso.

Eifion
fuente
28

En su ejemplo, es solo parte del nombre del método. ¡En Ruby también puedes usar signos de exclamación en los nombres de los métodos!

Otro ejemplo de signos de interrogación en Ruby sería el operador ternario.

customerName == "Fred" ? "Hello Fred" : "Who are you?"
Andy Gaskell
fuente
13
Para ampliar la respuesta de Andy, también verá cosas como: customerName == user.logged_in? ? user.name: "¿Quién eres?" Tenga en cuenta el doble signo de interrogación
Signo de interrogación
16

En tu ejemplo

product.valid?

Es en realidad una llamada a función y llama a una función llamada valid?. Ciertos tipos de "prueba de condición" / funciones booleanas tienen un signo de interrogación como parte del nombre de la función por convención.

Timo Geusch
fuente
41
answer.gsub! (/ function /, 'method')
glenn jackman
15

Puede valer la pena señalar que los ?s solo se permiten en nombres de métodos, no en variables. En el proceso de aprendizaje de Ruby, supuse que ?designaba un tipo de retorno booleano, así que intenté agregarlos a las variables de marca, lo que condujo a errores. Esto me llevó a creer erróneamente por un tiempo que había una sintaxis especial que involucraba ?s.

Relevante: ¿Por qué un nombre de variable no puede terminar con `?` Mientras que el nombre de un método sí puede?

Rico smith
fuente
9

Creo que es solo una convención para cosas que son booleanas. Un poco como decir " IsValid".

Neil Barnwell
fuente
1
comentario conciso e impresionante especialmente "Un poco como decir" IsValid "
Kick Buttowski
2

También se usa en expresiones regulares, que significa "como máximo una repetición del carácter anterior"

por ejemplo, la expresión regular /hey?/ coincide con las cadenas " he" y " hey".

José Joel.
fuente
0

También es una convención común para usar con el primer argumento del método de prueba de Kernel # test

irb(main):001:0> test ?d, "/dev" # directory exists?
=> true
irb(main):002:0> test ?-, "/etc/hosts", "/etc/hosts" # are the files identical
=> true

como se ve en esta pregunta aquí

jtzero
fuente
3
No está relacionado con test, ?des un atajo para "d". testtoma una cadena de un carácter como primer argumento, por lo que puede llamarla con test ?d, "/dev"o test "d", "/dev".
bfontaine