2010-02-12 9 views
5

J'ai une instruction if dans mon application Rails. Je dois faire une sorte de vérification de base "si vrai et! Faux". L'expression est définie comme:Ruby: Pourquoi 'and not' fonctionne-t-il quand '&&! (Expr)' ne fonctionne pas?

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 

Si je mets que mon expression à un si, le cas ne se déclenche pas. Si je cours cette expression dans la console, je deviens faux.

Maintenant, si je modifie l'expression comme suit:

ActiveRecord::Base.connection.tables.include? 'settings' and not Settings.setting_is_set?('defaults_set') 

Il retourne vrai comme il se doit, et l'exécute est bloc.

Donc la question est: Pourquoi est 'expression & &! Expression' ne se comporte pas comme 'expression et non expression'. C'est ma compréhension & & et! devrait correspondre à et et pas presque directement.

Qu'est-ce qui me manque ici?

+0

Il est plus que probable que cela soit dû à la priorité de l'opérateur. Je suis assez clair à ce sujet en PHP et Python, mais pas Ruby - j'espère que quelqu'un qui connaît mieux Ruby que moi viendra et expliquera comment cela fonctionne dans Ruby. – JAL

+0

Ceci est une copie exacte de http://StackOverflow.Com/questions/2083112/ –

Répondre

6

C'est parce que lorsque vous utilisez && Ruby interprète la fin entière de la chaîne comme un argument unique étant passé à include. Mettez les parenthèses autour de la 'settings' et la première déclaration fonctionnera bien:

ActiveRecord::Base.connection.tables.include? 'settings' && !Settings.setting_is_set?('defaults_set') 
# => false 

ActiveRecord::Base.connection.tables.include?('settings') && !Settings.setting_is_set?('defaults_set') 
# => true 

D'une certaine façon, lorsque vous utilisez and not il sait que la deuxième partie ne fait pas partie de ce qui est passé à include et votre appel réussit.

+7

'and' a une priorité inférieure à' && '. Ceci est un rubis commun gotcha: http://stackoverflow.com/questions/372652/what-are-the-ruby-gotchas-a-newbie-should-be-warned-about –

+0

Cela a fait l'affaire. Je vous remercie. –

+0

Je n'utilise jamais et/ou, et seulement &&/||. Dans la plupart des langues, vous vous attendez à ce que ces constructions aient une haute priorité; et/ou ne le font pas. – Shadowfirebird

0

‘not’ est un opérateur de contrôle, ! est un opérateur logique. La différence est que 'non' a une priorité inférieure lors de l'évaluation de la commande. Utilisez ! lorsque vous exécutez des expressions logiques.

Questions connexes