Je me demande juste ce que !!
est en Ruby.
Ce n'est pas une mauvaise pratique que de l'utiliser. Le double bang est souvent utilisé dans les prédicats (méthodes se terminant par ?) pour retourner une valeur booléenne explicite.
Non, non.
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 puisque les seules valeurs fausses à Ruby sont nil
y false
donc il est généralement préférable de laisser cette convention en place.
Pensez-y comme
!(!some_val)
Une chose à laquelle il sert légitimement est d'empêcher le retour d'un gros morceau de données. Par exemple, vous ne souhaitez probablement pas renvoyer 3 Mo de données d'images dans votre fichier has_image?
ou vous ne souhaitez peut-être pas renvoyer l'intégralité de votre objet utilisateur dans la méthode logged_in?
méthode. Utilisation de !!
convertit ces objets en un simple true
/ false
.
Ce n'est pas une mauvaise pratique que de l'utiliser. Le double bang est souvent utilisé dans les prédicats (méthodes se terminant par ?) pour retourner une valeur booléenne explicite.
Alex, tu n'as pas vraiment à t'inquiéter de renvoyer de gros objets, car Ruby renvoie une référence, et non une copie de l'objet.
@DSimon, il est parfois nécessaire de se préoccuper des objets de grande taille, comme lors de l'impression ou de l'enregistrement d'une valeur pendant le débogage.
!
signifie négation d'un état booléen, deux !
n'a rien de spécial, si ce n'est une double négation.
!true == false
# => true
Il est couramment utilisé pour forcer une méthode à retourner un booléen. Il détectera tout type de vérité, comme les chaînes de caractères, les entiers et autres, et le transformera en booléen.
!"wtf"
# => false
!!"wtf"
# => true
Un cas d'utilisation plus réel :
def title
"I return a string."
end
def title_exists?
!!title
end
Ceci est utile lorsque vous voulez vous assurer qu'un booléen est renvoyé. Cependant, à mon avis, c'est un peu inutile, étant donné que les deux fonctions if 'some string'
y if true
est exactement le même flux, mais certaines personnes trouvent utile de retourner explicitement un booléen.
Notez que cet idiome existe également dans d'autres langages de programmation. Le C ne disposait pas d'une fonction intrinsèque bool
de sorte que tous les booléens sont typés en tant que int
à la place, avec des valeurs canoniques de 0
o 1
. Prenons cet exemple (les parenthèses ont été ajoutées pour plus de clarté) :
!(1234) == 0
!(0) == 1
!(!(1234)) == 1
La syntaxe "not-not" convertit tout nombre entier non nul en 1
la valeur booléenne canonique vraie.
En général, cependant, je trouve qu'il est bien mieux d'établir une comparaison raisonnable que d'utiliser cet idiome peu commun :
int x = 1234;
if (!!x); // wtf mate
if (x != 0); // obvious
C'est utile si vous avez besoin de faire un exclusif ou . Copie de la réponse de Matt Van Horn avec de légères modifications :
1 ^ true
TypeError: can't convert true into Integer
!!1 ^ !!true
=> false
Je l'ai utilisé pour m'assurer que deux variables étaient soit toutes les deux nulles, soit toutes les deux non nulles.
raise "Inconsistency" if !!a ^ !!b
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.