2016-02-29 44 views
6

Perché le seguenti espressioni risolvono il loro modo di fare? Le parentesi dovrebbero avere maggiore precedenza rispetto a quelle nuove, non dovrebbero?Perché le nuove righe tra parentesi cambiano i risultati aritmetici?

3 - (1 + 1) 
# => 1 

3 - (1 
    + 1) 
# => 2 

Tralasciando la più permette anche l'espressione restituiscono 2:

3 - (1 
     1) 
# => 2 

Se dichiaro come una nuova riga continua (sfuggito) o spostare il più alla prima linea, si ottiene comportamento desiderato:

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

3 - (1 + 
     1) 
# => 1 

risposta

5

È perché Ruby riconosce una nuova riga come fine di un'espressione a meno che l'espressione non sia completa. Ad esempio,

(1 
+ 1) 

è uguale

(1; 
+1) 

che è la stessa come +1 dall'ultima espressione tra parentesi viene restituito. E questo è ulteriormente lo stesso di 1.

Quando si ha un + alla fine di una riga, l'espressione è incompleta e quindi continua alla riga successiva. Che fa:

3 - (1 + 
     1) 

debba essere interpretato nel 3 - (1 + 1).

2

Se si dispone di codice tra parentesi, ogni riga sarà minacciata come codice di codice separato se non verrà terminata con \ o ne verrà avviata una nuova con operatore matematico.

Quindi nel tuo esempio:

def plus_minus_if_you_understand_this_the_problem_is_solved_i_guess 
    3 - (1 
     1) 
end 

significa che ho il numero 3 e da sottrarre l'espressione tra parentesi. Nelle parentesi ho linea # 1 il numero 1 e # 2 linea numero 1 di nuovo e come è ultima riga di espressione è retuned da Ruby (come in def ultimo elemento prima end viene restituito Quindi:.

(3 # doing nothing 
    1) # returns 1 

anche Di nuovo, questa parte del codice restituisce 2 poiché è l'ultimo elemento tra parentesi:

(puts "hello!" 
    2) => 2