In Ruby (e in molti altri linguaggi) ci sono molti valori che valutano in true
in un contesto booleano e una manciata che valuterà in falso. In Ruby, the only two things that evaluate to false
are false
(itself) and nil
.
Se si nega qualcosa, questo impone un contesto booleano. Certo, lo nega anche. Se lo si nega, esso impone il contesto booleano, ma restituisce il valore booleano corretto.
Ad esempio:
"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)
Nel tuo esempio, il metodo signed_in?
dovrebbe restituire un valore booleano (come indicato dalla convenzione dal carattere ?
). La logica interna che utilizza per decidere questo valore è verificando se la variabile current_user
è impostata. Se è impostato, verrà valutato su true
in un contesto booleano. In caso contrario, valuterà come falso. La doppia negazione impone che il valore di ritorno sia un valore booleano.
Hai dato un'occhiata alle domande che ti sono state fornite dopo aver digitato il titolo della domanda? – Nakilon
Sì, non c'era niente lì. In realtà ho trovato una domanda simile spiegandomi la seconda domanda, ma ho dovuto cercare "double bang" che non è così ovvio come si potrebbe pensare. – Vitaly
Sì, l'algoritmo di domande simili viene ingannato facilmente quando parti importanti del titolo sono caratteri di punteggiatura. – pkaeding