Je me demande simplement ce qu'il !!
y a dans Ruby.
134
Pas pas. Il est utilisé pour convertir une valeur en booléen:
!!nil #=> false
!!"abc" #=> true
!!false #=> false
Il n'est généralement pas nécessaire de l'utiliser car les seules fausses valeurs de Ruby sont nil
et false
, il est donc généralement préférable de laisser cette convention en vigueur.
Pensez-y comme
!(!some_val)
Une chose à laquelle il est légitimement utilisé est d'empêcher le retour d'une énorme quantité de données. Par exemple, vous ne souhaitez probablement pas renvoyer 3 Mo de données d'image dans votre has_image?
méthode, ou vous ne souhaitez peut-être pas renvoyer l'intégralité de votre objet utilisateur dans la logged_in?
méthode. Utiliser !!
convertit ces objets en un simple true
/ false
.
.nil?
au lieu d'utiliser!!
? Y a-t-il une différence?!!true #=> true
ettrue.nil? #=> false
Il renvoie
true
si l'objet de droite n'est pasnil
et nonfalse
,false
s'il estnil
oufalse
la source
!
signifie nier l'état booléen, deux!
s n'ont rien de spécial, à part une double négation.Il est couramment utilisé pour forcer une méthode à renvoyer un booléen. Il détectera tout type de véracité, comme une chaîne, des entiers et autres, et le transformera en booléen.
Un cas d'utilisation plus réel:
Ceci est utile lorsque vous voulez vous assurer qu'un booléen est renvoyé. IMHO, c'est un peu inutile, cependant, vu que les deux
if 'some string'
et queif true
c'est exactement le même flux, mais certaines personnes trouvent utile de renvoyer explicitement un booléen.la source
title
, autant faire la chose la plus proche ... Je supposeNotez que cet idiome existe également dans d'autres langages de programmation. C n'avait pas de
bool
type intrinsèque , donc tous les booléens ont été typés comme à laint
place, avec des valeurs canoniques de0
ou1
. Prend cet exemple (parenthèses ajoutées pour plus de clarté):La syntaxe "not-not" convertit tout entier différent de zéro en
1
la valeur vraie booléenne canonique.En général, cependant, je trouve beaucoup mieux de faire une comparaison raisonnable que d'utiliser cet idiome inhabituel:
la source
C'est utile si vous avez besoin de faire un ou exclusif . Copie de la réponse de Matt Van Horn avec de légères modifications:
Je l'ai utilisé pour m'assurer que deux variables étaient soit nulles, soit toutes deux non nulles.
la source
C'est "double négatif", mais la pratique est découragée. Si vous utilisez rubocop , vous le verrez se plaindre d'un tel code avec un
Style/DoubleNegation
violation.La justification stipule:
la source
!!false # => false
pendant que!false.nil? # => true
!(foo.nil? || foo == false)
- plus verbeux, oui, mais moins cryptique.Comprendre comment cela fonctionne peut être utile si vous devez convertir, par exemple, une énumération en booléen. J'ai du code qui fait exactement cela, en utilisant le
classy_enum
gem:Ensuite, dans le code de service, j'ai, par exemple:
En fait, l'opérateur bangbang est devenu ce que j'aurais pu autrement écrire comme une méthode appelée to_bool.
la source