En Ruby (y en muchos otros idiomas) hay muchos valores que se evalúan como true
en un contexto booleano, y algunos que se evaluarán como falsos. En Ruby, the only two things that evaluate to false
are false
(itself) and nil
.
Si niega 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 su ejemplo, el método signed_in?
debería devolver un valor booleano (como se indica por convención por el carácter ?
). La lógica interna que utiliza para decidir este valor es verificando si la variable current_user
está configurada. Si está configurado, se evaluará a true
en un contexto booleano. Si no, se evaluará como falso. La doble negación obliga al valor de retorno a ser booleano.
¿Hizo una ojeada a las preguntas, que le fueron dadas después de que escribió el título de su pregunta? – Nakilon
Sí, no había nada allí. De hecho, encontré una pregunta similar que me explicaba la segunda pregunta, pero tuve que buscar por "doble explosión", lo cual no es tan obvio como podría pensar. – Vitaly
Sí, el algoritmo de preguntas similares se engaña fácilmente cuando partes importantes del título son caracteres de puntuación. – pkaeding