¿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 if
construcción.
¿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 if
construcción.
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.
?
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í.
isEmpty()
, isDigit()
, etc. En Ruby, los mismos métodos sería escrito empty?
, y digit?
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 para nullable
:)
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 ?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
.
'F'
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?"
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.
Creo que es solo una convención para cosas que son booleanas. Un poco como decir " IsValid
".
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
".
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í
test
, ?d
es un atajo para "d"
. test
toma una cadena de un carácter como primer argumento, por lo que puede llamarla con test ?d, "/dev"
o test "d", "/dev"
.