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


¿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 construcción if.

 170
Author: Charlie, 2009-08-28

9 answers

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.

 243
Author: chillitom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-18 03:27:05

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

Por ejemplo:

?F # => will return 70

Alternativamente en ruby 1.8 puedes hacer:

"F"[0]

O en ruby 1.9:

"F".ord

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

 72
Author: Greg Osuri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-02 01:48:59

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.

 37
Author: Eifion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-28 09:08:27

En su ejemplo es solo parte del nombre del método. En Ruby también puede utilizar 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?"
 24
Author: Andy Gaskell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-28 09:16:52

En su ejemplo

product.valid?

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

 15
Author: Timo Geusch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-18 03:29:12

¿Vale la pena señalar eso ?s solo se permiten en nombres de métodos, no en variables. En el proceso de aprender Ruby, ¿asumí eso ? designado un tipo de retorno booleano, así que intenté agregarlos a las variables de bandera, lo que llevó a errores. Esto me llevó a creer erróneamente por un tiempo que había alguna sintaxis especial que involucraba ?s.

Relevante: ¿Por qué un nombre de variable no puede terminar con `?'mientras que un nombre de método puede?

 12
Author: Rich Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:18

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

 5
Author: Neil Barnwell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-05 20:59:52

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

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

 1
Author: José Joel.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-18 03:28:16

También es una convención común para usar con el primer argumento del método test 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í

 0
Author: jtzero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-01 17:01:31