138 votes

Que signifie ! ! en ruby ?

Je me demande juste ce que !! est en Ruby.

165voto

Alex Wayne Points 58113

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 .

8 votes

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.

6 votes

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.

10 votes

@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.

31voto

RichH Points 4277

Il retourne true si l'objet à droite n'est pas nil et non false , false si c'est le cas nil o false

def logged_in?   
  !!@current_user
end

1 votes

Était-il évident que cela venait de Restful_Auth ? ! :D

14voto

August Lilleaas Points 25812

! 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.

0 votes

Il me semble que c'est un moyen plus rapide que d'utiliser une instruction if ou un opérateur ternaire. Puisque vous ne pouvez pas simplement retourner title autant faire ce qui s'en rapproche le plus... Je suppose que

6voto

Tom Points 6758

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

0 votes

Ou simplement si (x). ! ! est utile lorsque vous avez besoin d'obtenir soit 0/1. Vous pouvez ou non considérer (x) ? 1 : 0 plus clair.

3voto

Andrew Grimm Points 22996

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.com

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.

Powered by:

X