31 votes

Utilisation de la double négation (!!)

Bon alors je suis tombé sur un code qui ressemble à

 @documents_names = sort {
         !!$deleted_documents_names{$a} == !!$deleted_documents_names{$b}
          ? uc($a) cmp uc($b)
          : !!$deleted_documents_names{$a}
          cmp !!$deleted_documents_names{$b}
         } @documents_names;
 

C'est la première fois que je vois l'utilisation de la double négation. À quoi ça sert? Quand une personne l'utiliserait-elle?

44voto

ronalchn Points 7215

Il convertit non les types boolean boolean (dualvar(0,"") ou 1).

C'est un raccourci façon de faire cela, au lieu d'essayer de la lancer explicitement (ce qui peut prendre plus de caractères). L' ! opérateur annule la truthness de son argument. Par conséquent, les deux d'entre eux sont utilisés.

De nombreux types d'objets sont "truthy", et d'autres sont "falsey".

  • La seule fausse les valeurs sont 0, undef, "", "0" et certains surchargé d'objets.
  • Des exemples de vraies valeurs sont 1, "asdf", et toutes les autres valeurs.

10voto

Zaid Points 21192

C'est beaucoup de funk pour un bloc sort !

C'est essentiellement un tri à deux niveaux:

  1. ascii-betical
  2. les fichiers supprimés en premier, puis non supprimés

On pourrait donc le réécrire comme (non testé):

 @documents = sort {  exists $deleted_documents_names{$a} # same effect as '!!'
                       <=> 
                     exists $deleted_documents_names{$b}
                  ||
                     uc( $a ) cmp uc( $b )
                  }
             @documents;
 

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