2011-02-10 10 views
6

Una stupida, domanda sintattica:Rubino Assegnazione Sintassi

Se l'operatore di assegnazione è in realtà una funzione, come

def value=(x) 
    @value = x 
end 

senza uno spazio tra l'operando di sinistra e il "=", allora perché può l'assegnazione essere fatto come test.value = x (con uno spazio), ma la definizione metodo non può essere scritto come:

def value = (x) 
    @value = x 
end 

con lo spazio. È semplicemente sintassi dettata dal parser?

+1

Si potrebbe chiedere, come pure "Se il latte è bianco, perché il cielo non è? .." –

risposta

6

def deve essere seguito da un token per il nome della funzione, opzionalmente seguito da un elenco di argomenti. La parentesi nell'elenco degli argomenti è facoltativa (ad esempio, def value= x è una definizione appropriata). def value = (x) si presenta come def seguito da due token e quindi da un elenco di argomenti, che non viene analizzato.

+0

Il parser è abbastanza intelligente per sapere che la dichiarazione test.value = x non è un token seguito da due parametri passati. Perché non analizza la definizione del metodo in modo simile? – inyourcorner

+0

@inyourcorner ma non si sta facendo affidamento sulla parola chiave 'def' nell'esempio – Woot4Moo

+0

@inyourcorner: Ciò è completamente diverso dalla definizione della funzione. Il gestore per l'assegnazione sa controllare i metodi value = nell'oggetto ricevente (l'analisi non è coinvolta). – cam

1

Questo è parser/interprete magico.

Quando l'interprete vede il compito cerca un metodo di abbinamento.

Sono d'accordo con voi in merito (quasi), penso che il compito dovrebbe essere some.value= x (senza spazio tra 'valore' e '=') sempre.

Scala fa qualcosa di simile, ma utilizza una sottolineatura def value_= (x: X)

Problemi correlati