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.