operaciones - Ruby, !! operador(a/k/a la doble explosión)
operadores de comparacion ruby (4)
Posible duplicado:
Que hace !! significa en ruby?
Hola,
Soy nuevo en Ruby y no puedo encontrar ninguna descripción de qué "!!" medio.
Aquí hay un ejemplo:
def signed_in?
!!current_user
end
Si esto es un doble negativo, por qué no decir:
def signed_in?
current_user
end
Por favor ayuda.
Como correctamente entendiste, es un uso doblemente negativo de !
operador. Dicho esto, aunque puede ser una forma abreviada de comprobar si una variable puede ser nula o no, la OMI es demasiado concisa . Echa un vistazo a this y this publicación. Tenga en cuenta que en Ruby, probar algo a cero se evaluará como falso.
En Ruby (y en muchos otros idiomas) hay muchos valores que se evalúan como true
en un contexto booleano, y un puñado que se evaluará como falso. En Ruby, las únicas dos cosas que se evalúan como false
son false
(en sí mismas) y nil
.
Si niegas algo, eso fuerza un contexto booleano. Por supuesto, también lo niega. Si lo niega dos veces, fuerza el contexto booleano, pero devuelve el valor booleano adecuado.
Por ejemplo:
"hello" #-> this is a string; it is not in a boolean context
!"hello" #-> this is a string that is forced into a boolean
# context (true), and then negated (false)
!!"hello" #-> this is a string that is forced into a boolean
# context (true), and then negated (false), and then
# negated again (true)
!!nil #-> this is a false-y value that is forced into a boolean
# context (false), and then negated (true), and then
# negated again (false)
En tu ejemplo, el signed_in?
El método debe devolver un valor booleano (según lo indicado por la convención por el carácter ?
). La lógica interna que usa para decidir este valor es verificando si la variable current_user
está configurada. Si está configurado, se evaluará como true
en un contexto booleano. Si no, se evaluará como falso. La doble negación obliga al valor de retorno a ser booleano.
En la mayoría de los lenguajes de programación, incluido Ruby !
devolverá el opuesto del valor booleano del operando. Entonces, cuando encadena dos signos de exclamación, convierte el valor a booleano.
!!
es justo !
(el operador de negación booleana) escrito dos veces. Niega el argumento, luego niega la negación. Es útil porque puede usarlo para obtener un booleano de cualquier valor. ¡El primero !
convertirá el argumento en booleano, por ejemplo, true
si es nil
o false
, y false
caso contrario. El segundo lo negará nuevamente para que usted obtenga el valor booleano del argumento, false
para nil
o false
, true
para casi todo lo demás.
En Ruby puede usar cualquier valor en una instrucción if
, por ejemplo if current_user
se ejecutará si el usuario actual no es nil
. La mayoría de las veces esto es genial porque nos ahorra tipear pruebas explícitas (como if !current_user.nil?
Que es al menos seis caracteres más). Pero a veces puede ser realmente confuso si devuelve un objeto cuando el método implica que devuelve un booleano. Métodos cuyo nombre termina con ?
debe devolver valores de falsedad o falsedad, es decir, devuelve algo que se evaluará como true
o false
. Sin embargo, puede ser realmente complicado si signed_in?
devuelto un objeto de usuario. Por ejemplo, si intentas depurar por qué algunos códigos usan signed_in?
no funciona, probablemente te confundas mucho cuando un objeto de usuario aparece donde esperabas true
o false
. En esa situación, es útil agregar !!
antes del return
ya que eso garantiza que el valor de falsedad o falsedad se devolverá como true
o false
.