2010-01-13 18 views
10

Estoy usando un código que usa esta sintaxis (autenticación relajante).que hace !! hacer en ruby?

def logged_in? 
    !!current_user() 
end 

Probamos google para esto, pero sólo parece ignorar "!!", aceptará una respuesta que me puede decir cómo encontrar información sobre la búsqueda de cadenas como !! en Google.

+3

la el personaje se llama explosión. Google para "ruby double bang" arroja algunos buenos resultados. – shsteimer

+0

Ahh sí, me olvidé del término de exclamación. ¿Es bang un término americano? Realmente no lo usamos en el Reino Unido, solo lo escuchamos en términos de software. Otro ejemplo es C#, que en el Reino Unido generalmente se llamaría C hash. – Jim

+0

posible duplicado de [¿Qué hace! significa en ruby?] (http://stackoverflow.com/questions/524658/what-does-mean-in-ruby) –

Respuesta

30

Es doble negación. El primer ! lo convierte a false si current_user no es nil o false. Después de eso, lo convierte en true. Entonces el resultado siempre es un valor booleano y no el valor de current_user. El resultado siempre es true si current_user no es false o nil. De lo contrario, es false.

+7

Por ejemplo, convierte un valor de verdad o falsey en un valor genuinamente booleano (truthy => 'true', falsey =>' false'). Vea también esta pregunta: http://stackoverflow.com/questions/1310344 –

+0

Esto es muy útil para forzar un valor arbitrario a un booleano simple. – tadman

+0

Gracias por todas las respuestas, varias personas realmente respondieron la pregunta, y muy rápidamente también. He seleccionado la respuesta más popular como la respuesta correcta, espero que sea agradable. – Jim

3

Este artículo parece usar el mismo código:

http://toolmantim.com/articles/bangbang_your_nil_is_dead

Básicamente, parece que está sólo la intención de aplicar el no (!) Operador dos veces: básicamente obliga al método a devolver verdadero o falso en lugar de verdadero, falso o nulo.

Es decir, si @current_user es nula, llamando

def logged_in? 
    @current_user() 
end 

volverá nula. Si lo cambia a (single explosión)

def logged_in? 
    [email protected]_user() 
end 

devolverá verdadero, y cambiando adicionalmente a (doble explosión)

def logged_in? 
    [email protected]_user() 
end 

devolverá FALSE - que es más aplicable (y utilizable) que nil.

otra manera de escribir sería:

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

pero que no cubre el caso cuando @current_user es falso, y creo que el !! es más agradable a la vista.

8

Es el operador de negación, !, dos veces. Esto le da un valor que tiene el mismo valor de verdad, pero explícitamente es solo un booleano.

En Ruby, hay muchos valores que se consideran para ser "verdadero" (algo además false y nil), y un par que se considera que es "falso" (ambos false y nil). La primera negación convierte todos los valores verdaderos a false, y todos los valores falsos a true. La segunda negación luego invierte eso, dejándole un valor que tiene el mismo valor de verdad que el original, pero que solo permite los valores reales true o false.

Esto puede ser útil si no desea que las personas usen logged_in? como una forma de acceder al usuario actual, sino que desea que simplemente devuelva un booleano.

Él él equivalente a la más explícito y detallado: "!"

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