operadores operador operaciones enteros comparacion ruby operators

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 .