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.
Réponses
Trop de publicités?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.
!!
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
.
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.