La priorité des opérateurs pour et / && en Ruby [double]
-
12-09-2019 - |
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?
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:
- &&
- =
- 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
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