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.
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.
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.
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.
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".
Respuestas:
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.
fuente
?
in Ruby (es un operador ternario, que convierte un carácter a su entero ASCII, uso entest
, en RegEx'es, etc.), muchos de los cuales están cubiertos en las otras respuestas aquí.isEmpty()
,isDigit()
, etc. En Ruby, los mismos métodos sería escritoempty?
, ydigit?
que es bastante más agradable bit OMI.is
todo el tiempo. Esto puede ser muy confuso para alguien que viene de Swift ya que el signo de interrogación no se utiliza paranullable
:)También tenga
?
en cuenta que junto con un carácter, devolverá el código de carácter ASCII paraA
Por ejemplo:
Alternativamente en ruby 1.8 puedes hacer:
o en ruby 1.9:
También
?F
tenga en cuenta que devolverá la cadena"F"
, por lo que para acortar el código, también puede usar?F.ord
Ruby 1.9 para obtener el mismo resultado que"F".ord
.fuente
'F'
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.
fuente
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.
fuente
En tu ejemplo
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.fuente
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?
fuente
Creo que es solo una convención para cosas que son booleanas. Un poco como decir "
IsValid
".fuente
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
".fuente
También es una convención común para usar con el primer argumento del método de prueba de Kernel # test
como se ve en esta pregunta aquí
fuente
test
,?d
es un atajo para"d"
.test
toma una cadena de un carácter como primer argumento, por lo que puede llamarla contest ?d, "/dev"
otest "d", "/dev"
.