2010-01-13 33 views
10

Sto usando un codice che utilizza questa sintassi (autenticazione restful).cosa fa !! fare in rubino?

def logged_in? 
    !!current_user() 
end 

provato googling per questo, ma sembra solo di ignorare "!!", accetterà una risposta che può dirmi come trovare informazioni sulla ricerca di stringhe come ad esempio !! in google.

+3

la il personaggio è chiamato botto. googling per "ruby double bang" porta dei buoni risultati. – shsteimer

+0

Ahh sì, ho dimenticato il termine bang per i punti esclamativi. Bang è un termine americano? In realtà non lo usiamo nel Regno Unito, ne abbiamo mai sentito parlare solo in termini di software. Un altro esempio è C#, che nel Regno Unito sarebbe generalmente chiamato C hash. – Jim

+0

possibile duplicato di [Che cosa fa !! significa in ruby?] (http://stackoverflow.com/questions/524658/what-does-mean-in-ruby) –

risposta

30

È una doppia negazione. Il primo ! lo converte in false se current_user non è nil o false. Dopo di che lo converte in true. Quindi il risultato è sempre un valore booleano e non il valore di current_user. Il risultato è sempre true se current_user non è false o nil. Altrimenti è false.

+7

Ad es. converte un valore di verità o falso in un valore booleano autentico (truthy => 'true', falsey =>' false'). Vedi anche questa domanda: http://stackoverflow.com/questions/1310344 –

+0

Questo è molto utile per forzare un valore arbitrario ad un semplice booleano. – tadman

+0

Grazie a tutte le risposte, diverse persone hanno risposto alla domanda in modo molto rapido. Ho selezionato la risposta più popolare come risposta corretta, spero che sia gradevole. – Jim

3

questo articolo sembra utilizzare lo stesso codice:

http://toolmantim.com/articles/bangbang_your_nil_is_dead

In sostanza, sembra che è solo lo scopo di applicare la non (!) Operatore due volte - essenzialmente forzando il metodo a restituire vero o falso anziché vero, falso o nulla.

Cioè, se @current_user è pari a zero, chiamando

def logged_in? 
    @current_user() 
end 

tornerà a zero. Cambiandolo (singolo scoppio)

def logged_in? 
    [email protected]_user() 
end 

restituisce true, e cambiando in seguito (doppia scoppio)

def logged_in? 
    [email protected]_user() 
end 

restituirà false - che è più applicabile (ed utilizzabili) di zero.

Un altro modo di scrivere che sarebbe stato:

def logged_in? 
    [email protected]_user().nil? 
end 

ma che non copre il caso in cui @current_user è falso, e credo che il !! è più bello da guardare.

8

È l'operatore di negazione, !, due volte. Questo dà un valore che ha lo stesso valore di verità, ma è esplicitamente solo un booleano.

In Ruby, ci sono molti valori che sono considerati essere "vera" (nulla oltre false e nil), e una coppia che sono considerati "false" (sia false e nil). La prima negazione converte tutti i valori veri in false e tutti i valori falsi in true. La seconda negazione quindi la inverte, lasciandovi un valore che ha lo stesso valore di verità dell'originale, ma che consente solo i valori effettivi true o false.

Questo può essere utile se non si desidera che le persone utilizzino logged_in? come un modo per accedere all'utente corrente, ma si preferisce che restituisca solo un valore booleano.

Esso esso equivalente al più esplicita e verbose: "!"

def logged_in? 
    if current_user() 
    true 
    else 
    false 
    end 
end