Différence entre «not» et «!» En rubis

Réponses:

143

Ils le sont presque, mais pas tout à fait. La différence est que !a une priorité plus élevée que not, tout comme &&et ||sont de priorité plus élevée que andet or.

!a la priorité la plus élevée de tous les opérateurs, et l' notune des plus basses, vous pouvez trouver le tableau complet dans la documentation Ruby .

À titre d'exemple, considérons:

!true && false
=> false

not true && false
=> true

Dans le premier exemple, !a la priorité la plus élevée , vous dites donc effectivement false && false.
Dans le deuxième exemple, nota une priorité inférieure à true && false, donc cela "commuté" le falsede true && falseà true.

La règle générale semble être que vous devriez vous en tenir !, à moins que vous n'ayez une raison spécifique d'utiliser not. !in Ruby se comporte de la même manière que la plupart des autres langages et est "moins surprenant" que not.

Brennan
la source
6
J'ai utilisé «non» dans le passé pour rendre les conditions négatives plus faciles à lire. Cela signifie que si l'intégralité du conditionnel devait être annulée, je me sentais à l'aise d'utiliser «pas» plutôt que «!». J'aime quand mon code se lit comme inglush
jaydel
@jaydel Pourriez-vous utiliser unlessdans ce cas?
Jacob
1
@Jacob, oui, définitivement. unlessn'est tout simplement pas vraiment favorisé dans le monde du rubis. Le consensus général est que cela ne fait que gêner lorsque cela !fonctionne aussi bien dans la plupart des situations. Je suis sûr qu'il y a des cas où moins peut être plus expressif, mais je reste clair.
Brennan
4
Je ne suis pas d'accord que ce unlesssoit défavorisé. La chose la plus proche d'un consensus dit le contraire.
Adam Lassek
1
Je voulais juste partager un exemple de la façon dont cela notpeut être surprenant . En Python, j'attribue parfois des booléens aux variables pour rendre les instructions if plus faciles à lire. Cela peut signifier utiliser le modèle x = not y, où y est quelque chose de complexe. Dans Ruby, x = !yfonctionne, mais x = not yobtient syntax error, unexpected tIDENTIFIER, expecting '('. L'ordre de priorité signifie que ce besoin des parenthèses autour du droit de l'affectation op au travail: x = (not y).
S. Kirby
13

Un moyen simple de comprendre l' notopérateur est de le considérer not true && falsecomme équivalent à!(true && false)

roniegh
la source