Question

    

Cette question a déjà une réponse ici:

    
            
  •              Différence entre « et » et && en Ruby?                                      7 réponses                          
  •     
    

J'ai une question concernant les et / && / = mots-clés dans Ruby.

Les documents de rubis dire que la priorité pour les mots-clés mentionnés est: (1) &&, (2) =, (3) et

.

J'ai ce bout de code que j'ai écrit:

def f(n) 
 n
end

if a = f(2) and  b = f(4) then  
    puts "1) #{a} #{b}" 
 end

if a = f(2) &&  b = f(4) then   
    puts "2) #{a} #{b}"     
end

La sortie est la suivante:

1) 2 4 [attendu]

2) 4 4 [ Pourquoi ?]

Pour une raison quelconque en utilisant la cause && a et b pour évaluer 4?

Était-ce utile?

La solution

Je ne comprends pas tout à fait la question que vous posez. Je veux dire, vous avez déjà donné la réponse vous-même, avant même poser la question:. && se lie plus serré que = tout and lie moins bien que =

Ainsi, dans le premier cas, l'expression est évaluée comme suit:

( a=f(2) )  and  ( b=f(4) )
( a=  2  )  and  ( b=f(4) )
      2     and  ( b=f(4) ) # a=2
      2     and  ( b=  4  ) # a=2
      2     and        4    # a=2; b=4
                       4    # a=2; b=4

Dans le second cas, l'évaluation est la suivante:

a   =   (  f(2) && ( b=f(4) )  )
a   =   (    2  && ( b=f(4) )  )
a   =   (    2  && ( b=  4  )  )
a   =   (    2  &&       4     ) # b=4
a   =                    4       # b=4
                         4       # b=4; a=4

Autres conseils

La raison est simple: la priorité. Comme vous le dites, l'ordre est:

  1. &&
  2. =
  3. et

Depuis && a priorité sur =, l'instruction est évaluée comme ceci:

if a = (f(2) && (b = f(4))) then 

Ce qui se traduit par:

if a = (2 && 4) then

Lorsque x et y sont des nombres entiers, x && y retourne y. résultats dans 2 && 4 Ainsi a = 4.

Par souci de comparaison, le premier est évalué comme suit:

if (a = f(2)) and  (b = f(4)) then 

De programmation Ruby 1.9 :

  

La seule différence entre les deux formes est priorité (and lie inférieure à &&).

Je ne connais pas les règles spécifiques qui peuvent aider dans cette situation, mais nous allons utiliser les priorités des opérations. En utilisant les règles de priorités, nous pouvons diviser le calcul de la seconde expression sur plusieurs étapes

1 f(2) &&  b => expr1
2 expr1 = f(4) => expr2
3 a = expr2

Évident que dans l'étape 2, nous obtenons une situation incorrecte - sur le côté gauche de = est rvalue - objet temporaire, qui ne peut être assignant par toute valeur. Je suppose que l'analyseur syntaxique briser les règles d'évaluation des priorités des expressions lorsque rencontre de telles situations. Plus de détails sur le calcul des expressions peuvent être trouvées

si vous modifiez votre code comme celui-ci, vous obtiendrez ce que vous attendez

def f(n) 
  n
end

if (a = f(2) and  b = f(4)) then  
  puts "1) #{a} #{b}" 
end

if (a = f(2)  and  b = f(4)) then   
  puts "2) #{a} #{b}"         
end

1) 2 4

2) 2 4

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top