tag ruby

ruby - title tag html



Que hace !! significa en ruby? (7)

Comprender cómo funciona puede ser útil si necesita convertir, por ejemplo, una enumeración en un booleano. Tengo un código que hace exactamente eso, usando la gema classy_enum :

class LinkStatus < ClassyEnum::Base def ! return true end end class LinkStatus::No < LinkStatus end class LinkStatus::Claimed < LinkStatus def ! return false end end class LinkStatus::Confirmed < LinkStatus def ! return false end end class LinkStatus::Denied < LinkStatus end

Luego en el código de servicio que tengo, por ejemplo:

raise Application::Error unless !!object.link_status # => raises exception for "No" and "Denied" states.

Efectivamente, el operador de bangbang se ha convertido en lo que de otro modo podría haber escrito como un método llamado to_bool.

¡Solo me preguntaba qué !! está en Ruby.


Devuelve true si el objeto de la derecha no es nil ni false , false si es nil o false

def logged_in? !!@current_user end


Es "doblemente negativo", pero la práctica está siendo desalentada. Si está utilizando rubocop , verá que se queje en dicho código con una violación de Style/DoubleNegation .

El rationale dice:

Como esto es a la vez críptico y usualmente redundante, debe evitarse [parafraseando:] Cambiar !!something para !something.nil?


Es útil si necesita hacer una exclusiva o . Copia de la respuesta de Matt Van Horn con ligeras modificaciones:

1 ^ true TypeError: can''t convert true into Integer !!1 ^ !!true => false

Lo usé para asegurar que dos variables fueran nulas o ambas no.

raise "Inconsistency" if !!a ^ !!b


No no Se usa para convertir un valor en booleano:

!!nil #=> false !!"abc" #=> true !!false #=> false

Por lo general, no es necesario utilizar, ya que los únicos valores falsos para Ruby son nil y false , por lo que generalmente es mejor dejar esa convención en pie.

Piense en ello como

!(!some_val)

Una cosa que se usa legítimamente es evitar que se devuelva una gran cantidad de datos. Por ejemplo, probablemente no desee devolver 3MB de datos de imagen en su has_image? método, o puede que no desee devolver su objeto de usuario completo en el logged_in? método. Usando !! convierte estos objetos a un true / false .


Tenga en cuenta que este idioma también existe en otros lenguajes de programación. C no tenía un tipo de bool intrínseco, por lo que todos los booleanos se escribieron en int , con valores canónicos de 0 o 1 . Toma este ejemplo (entre paréntesis para mayor claridad):

!(1234) == 0 !(0) == 1 !(!(1234)) == 1

La sintaxis "no no" convierte cualquier entero distinto de cero en 1 , el valor verdadero booleano canónico.

En general, sin embargo, me parece mucho mejor hacer una comparación razonable que usar este idioma poco común:

int x = 1234; if (!!x); // wtf mate if (x != 0); // obvious


! significa negar el estado booleano, ! dos ! s no es nada especial, aparte de una doble negación.

!true == false # => true

Se usa comúnmente para forzar un método para devolver un booleano. Detectará cualquier tipo de veracidad, como cadena, enteros y demás, y lo convertirá en un booleano.

!"wtf" # => false !!"wtf" # => true

Un caso de uso más real:

def title "I return a string." end def title_exists? !!title end

Esto es útil cuando quiere asegurarse de que se devuelve un booleano. En mi humilde opinión, no tiene sentido, sin embargo, al ver que tanto if ''some string'' y if true es if true es exactamente el mismo flujo, pero algunas personas encuentran útil devolver explícitamente un booleano.