92 votes

Ruby, !! opérateur (a / k / a le double coup)

Dupliquer possible:
Qu'est-ce que !! signifie en rubis?

Salut,

Je suis nouveau sur Ruby et ne trouve nulle part la description de ce "!!" veux dire.

Voici un exemple:

 def signed_in?
  !!current_user
end
 

S'il s'agit d'un double négatif, pourquoi ne pas dire:

 def signed_in?
  current_user
end
 

S'il vous plaît aider.

136voto

pkaeding Points 12935

En Ruby (et beaucoup d'autres langues) il y a beaucoup de valeurs qui donnent true dans un contexte booléen, et une poignée qui sera la valeur false. En Ruby, les deux seules choses qui évaluent false sont false (lui-même) et nil.

Si vous nier quelque chose, que les forces d'un contexte booléen. Bien sûr, il est également nie. Si vous double-nier, il force le booléen contexte, mais renvoie la bonne valeur booléenne.

Par exemple:

"hello"   #-> this is a string; it is not in a boolean context
!"hello"  #-> this is a string that is forced into a boolean 
          #   context (true), and then negated (false)
!!"hello" #-> this is a string that is forced into a boolean 
          #   context (true), and then negated (false), and then 
          #   negated again (true)
!!nil     #-> this is a false-y value that is forced into a boolean 
          #   context (false), and then negated (true), and then 
          #   negated again (false)

Dans votre exemple, l' signed_in? méthode doit retourner une valeur booléenne (comme indiqué par convention par l' ? de caractères). La logique interne, qu'il utilise pour décider cette valeur est de vérifier pour voir si l' current_user variable est définie. Si elle est définie, elle permettra d'évaluer à l' true dans un contexte booléen. Si non, il va évaluer la valeur false. La double négation des forces de la valeur de retour à une valeur de type boolean.

114voto

icktoofay Points 60218

Dans la plupart des langages de programmation, y compris Ruby, ! renverra le contraire de la valeur booléenne de l'opérande. Ainsi, lorsque vous enchaînez deux points d'exclamation, la valeur est convertie en un booléen.

30voto

Theo Points 60103

!! est juste ! (la négation booléenne opérateur) écrit deux fois. Il réduit à néant l'argument, alors nier la négation. C'est utile parce que vous pouvez l'utiliser pour obtenir un booléen à partir de n'importe quelle valeur. La première ! va convertir l'argument booléen, par exemple, true si nil ou false, et false sinon. La deuxième va réduire à néant qui, de nouveau, de sorte que vous obtenez la valeur booléenne de l'argument, false pour nil ou false, true pour à peu près tout le reste.

En Ruby, vous pouvez utiliser n'importe quelle valeur en if déclaration, par exemple, if current_user exécuté si l'utilisateur actuel n'est pas nil. La plupart du temps, c'est grand parce qu'il nous sauve de typage explicite tests (comme if !current_user.nil?, ce qui est au moins six caractères au plus). Mais parfois, il peut être très déroutant si vous retourne un objet lorsque la méthode implique qu'il renvoie un booléen. Les méthodes dont le nom se termine par ? doit retourner truthy ou falsy valeurs, c'est à dire le retour de quelque chose qui va évaluer à l' true ou false. Cependant, il peut être vraiment salissant si signed_in? retourné un objet utilisateur. Par exemple, si vous essayez de déboguer pourquoi un code qui utilise signed_in? ne fonctionne pas, vous aurez probablement être vraiment confus lorsqu'un objet utilisateur active jusqu'à l'endroit où vous attend true ou false. Dans cette situation, il est utile d'ajouter !! avant l' return depuis que la garantie que le truthy ou falsy valeur sera retournée comme true ou false.

4voto

Zabba Points 26372

Comme vous l'avez bien compris c'est un double négatif de l'utilisation de l' ! de l'opérateur. Cela dit, alors il peut être une abréviation moyen de vérifier si une variable peut être nul ou pas, IMO c'est trop concis. Jetez un oeil à ce et ce post. Notez que dans le Rubis, l'essai quelque chose à néant sera false.

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