2009-08-28 15 views
156

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

A veces parece como esto:

assert !product.valid? 

veces es en una construcción de if.

+0

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 dos puntos es un operador condicional ternario. El signo de interrogación en sí mismo es un operador de cotización único. Consulte http://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do –

Respuesta

215

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.

+4

Gracias, pero, ¿esta convención significa que solo hace _logic_ o podría haber efectos secundarios? Es curioso cómo esto es una especie de hack alrededor de un lenguaje tipeado con el tipo de devolución en el código. – Jason

+1

En este caso, es estrictamente un método de convención de nombres. No hay aplicación de 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 booleano ... pero definitivamente * debería * devolver un booleano. Sin embargo, hay varios otros usos del '?' En Ruby (es un operador ternario, convirtiendo un carácter en su entero ASCII, uso en 'test', en RegEx'es, etc.) muchos de los cuales están cubiertos en las otras respuestas aquí. –

+2

@Jason FYI, incluso los lenguajes fuertemente tipados tienen convenciones como esta. Por ejemplo, en los métodos Java que devuelven un valor booleano a menudo se les agrega el prefijo "es", como en 'isEmpty()', 'isDigit()', etc. En Ruby, los mismos métodos se escribirían 'empty?', Y 'digit?' que es bastante mejor IMO. – Ajedi32

35

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

5

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

+0

comentario conciso y sorprendente especialmente" Un poco como decir "IsValid" –

14

En su ejemplo

product.valid? 

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

+37

answer.gsub! (/ Function /, 'method') –

+0

Buen comentario ... lolz –

21

En su ejemplo, es solo parte del nombre del método. ¡En Ruby también puedes usar signos de admiració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?" 
+11

Para ampliar la respuesta de Andy, también verá cosas como: customerName == user.logged_in?? User.name: "¿Quién es usted?" Tenga en cuenta el doble signo de interrogación –

1

También se usa en expresiones regulares, que significa "a lo sumo una repetición del carácter anterior"

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

69

También tenga en cuenta ? junto con un personaje, devolverá el código de caracteres ASCII para A

Por ejemplo:

?F # => will return 70 

alternativamente en rubí 1.8 que puede hacer:

"F"[0] 

o en ruby ​​1.9:

"F".ord 

Observe también que ?F devolverá la cadena "F", por lo que para hacer el código más corto, también puede usar ?F.ord en Ruby 1.9 para obtener el mismo resultado que "F".ord.

+2

Interesante, gracias – rtacconi

+25

En ruby ​​1.9 Volverá '' F'' – klew

+2

El detalle que estaba buscando –

0

Es también una convención común utilizar con el primer argumento del método de testKernel#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 
+2

No está relacionado con 'test','? d' es un atajo para '" d "'. ' test' toma una cadena de un carácter como primer argumento, por lo que puede llamarlo con 'test? d,"/dev "' o 'test" d ","/dev "'. – bfontaine

10

Vale la pena señalar que? S sólo se permiten en los nombres de método, no variables.En el proceso de aprender Ruby, asumí eso? designé un tipo de retorno booleano, así que intenté agregarlos a las variables del marcador, lo que generó errores. Esto me llevó a creer erróneamente por un tiempo que había una sintaxis especial que implicaba "s".

Relevante: Why can't a variable name end with `?` while a method name can?

Cuestiones relacionadas