2016-02-29 4 views
6

Warum lösen die folgenden Ausdrücke ihre Vorgehensweise? Klammern sollten Vorrang vor Zeilenumbrüchen haben, oder?Warum ändern Zeilenumbrüche in Klammern die arithmetischen Ergebnisse?

3 - (1 
     1) 
# => 2 

Wenn ich erklären als kontinuierliche Newline (entkommen) oder bewegen das Plus auf die erste Zeile, das gewünschte Verhalten erreicht:

3 - (1 + 1) 
# => 1 

3 - (1 
    + 1) 
# => 2 

Weglassen der Plus lässt auch den Ausdruck 2 bewerten

3 - (1 \ 
    + 1) 
# => 1 

3 - (1 + 
     1) 
# => 1 

Antwort

5

Dies liegt daran, dass Ruby eine neue Zeile als Ende eines Ausdrucks erkennt, es sei denn, der Ausdruck ist unvollständig. Zum Beispiel

(1 
+ 1) 

ist die gleiche wie

(1; 
+1) 

die die gleiche wie +1 ist seit dem letzten Ausdruck in den Klammern zurückgegeben. Und das ist das gleiche wie 1.

Wenn Sie ein + am Ende einer Zeile haben, ist der Ausdruck unvollständig und wird daher in der nächsten Zeile fortgesetzt. Das macht:

3 - (1 + 
     1) 

als 3 - (1 + 1) interpretiert werden.

2

Wenn Sie Code in den Klammern haben, dann wird jede Zeile als separate Codezeile des Codes bedroht, wenn Sie sie nicht mit \ beenden oder mit mathematischem Operator neu beginnen.

So in Ihrem Beispiel:

def plus_minus_if_you_understand_this_the_problem_is_solved_i_guess 
    3 - (1 
     1) 
end 

Means Ich habe Nummer 3 und will Ausdruck in Klammern subtrahieren. In den Klammern habe ich Zeile # 1 Nummer 1 und in # 2 Zeilennummer 1 wieder und wie es letzte Zeile des Ausdrucks es von Ruby (wie in def letztem Elemente neu abgestimmt ist, bevor end zurückgegeben Also:.

(3 # doing nothing 
    1) # returns 1 

Auch Werfen Sie einen Blick nach unten. Auch dieser Teil des Codes gibt 2 zurück, da es das letzte Element in Klammern ist:

(puts "hello!" 
    2) => 2 
Verwandte Themen