Me encontré con esta línea de código rubí. ¿Qué &.
significa en esto?
@object&.method
Se llama el operador de navegación segura. Introducido en Ruby 2.3.0, le permite invocar métodos en objetos sin preocuparse de que el objeto pueda ser nil
(evitando un undefined method for nil:NilClass
error), similar al try
método en Rails .
Entonces puedes escribir
@person&.spouse&.name
en vez de
@person.spouse.name if @person && @person.spouse
De los documentos :
my_object.my_method
Esto envía el mensaje my_method a my_object. Cualquier objeto puede ser un receptor pero, dependiendo de la visibilidad del método, enviar un mensaje puede generar un NoMethodError.
Puedes utilizar &. para designar un receptor, entonces my_method no se invoca y el resultado es nulo cuando el receptor es nulo. En ese caso, los argumentos de my_method no se evalúan.
try!
método, notry
Nota: Aunque @Santosh dio una respuesta clara y completa, me gustaría agregar más antecedentes y una nota importante sobre su uso con variables que no son de instancia.
Se llama " Operador de navegación segura " ( también conocido como "Operador de encadenamiento opcional", "Operador condicional nulo", etc. ). Matz parece llamarlo "operador solitario". Fue introducido en Ruby 2.3 . Envía un método a un objeto solo si no lo es
nil
.Ejemplo:
"Caso de borde" con variables locales:
Tenga en cuenta que el código anterior usa variables de instancia. Si desea utilizar un operador de navegación seguro con variables locales, deberá verificar que sus variables locales se definan primero.
Para solucionar este problema, verifique si su variable local se define primero o configúrela en nil:
Fondo del método
Rails tiene un
try
método que básicamente hace lo mismo. Utiliza elsend
método internamente para llamar a un método. Matz sugirió que es lento y que esta debería ser una función de lenguaje incorporada.Muchos otros lenguajes de programación tienen características similares: Objetivo C, Swift, Python, Scala, CoffeeScript, etc. Sin embargo, una sintaxis común es
?.
(punto de pregunta). Pero, esta sintaxis no pudo ser adoptada por Ruby. Debido a que?
estaba permitido en los nombres de métodos y, por lo tanto, la?.
secuencia de símbolos ya es un código Ruby válido. Por ejemplo:Es por eso que la comunidad Ruby tuvo que proponer una sintaxis diferente. Fue una discusión activa y se consideraron diferentes opciones (
.?
,?
,&&
, etc.). Aquí hay una lista de algunas consideraciones:Al elegir la sintaxis, los desarrolladores observaron diferentes casos límite y la discusión es bastante útil. Si desea ver todas las variantes y matices del operador, consulte esta discusión de introducción de características en el rastreador oficial de problemas de Ruby.
fuente
.?
y se consideraron otras opciones, ¡pero&.
se eligió! Entonces, solo&.
funcionará.&.
y no.?
, mi mal. Actualicé mi respuesta. ¡Gracias por el aviso!user.?profile
debería seruser&.profile
(¡no podría editarlo yo mismo, ya que es solo una edición de 1 carácter!).¡Sé cauteloso! Aunque el operador de navegación segura es conveniente, también puede ser fácil engañarse para cambiar su lógica. Recomiendo evitar su uso en el control de flujo. Ejemplo:
En el primer ejemplo,
str.nil?
devuelvetrue
ystr.empty?
nunca se llama, loputs
que hace que se ejecute la instrucción. Sin embargo, en el segundo ejemplo,str&.empty?
devuelve elnil
cual es falsey, y laputs
declaración nunca se ejecuta.fuente
str.nil?
es verdadero (como usted dice), lo que significastr.empty?
que en realidad no se llamará en absoluto (así es como funciona el||
operador). El resto de su declaración es correcta.puts "hello" unless str&.present?
(carriles sólo para el presente método?)se usaba para verificación nula, como en kotlin y swift Por ejemplo; con Objeto -> Swift y Kotlin
este modelo puede ser nulo (Swift) o nulo (Kotlin) si no hemos definido el valor del modelo en la clase de automóvil. usamos ese signo en lugar de signo de interrogación en rubí
si usa car.model sin ampersand y si el modelo es nulo, el sistema no puede continuar ejecutándose.
fuente