2011-02-10 16 views
6

Un tonto, pregunta sintáctica:Rubí Asignación Sintaxis

Si el operador de asignación es realmente una función, como

def value=(x) 
    @value = x 
end 

sin un espacio entre el operando de la izquierda y los "=", entonces ¿por qué puede la asignación puede hacer como test.value = x (con un espacio), pero la definición del método no se puede escribir como:

def value = (x) 
    @value = x 
end 

con el espacio. ¿Es esto simplemente una sintaxis dictada por el analizador?

+1

Usted puede preguntar a su vez, "Si la leche es blanca, ¿por qué el cielo no es? .." –

Respuesta

6

def debe ir seguido de un token para el nombre de la función, opcionalmente seguido de una lista de argumentos. El paréntesis en la lista de argumentos es opcional (por ejemplo, def value= x es una definición apropiada). def value = (x) se parece a def seguido de dos tokens y luego una lista de argumentos, que no se analiza.

+0

El analizador es lo suficientemente inteligente como para saber que la declaración test.value = x no es un token seguido de dos parámetros pasados. ¿Por qué no analiza la definición del método de manera similar? – inyourcorner

+0

@inyourcorner pero no confía en la palabra clave 'def' en su ejemplo – Woot4Moo

+0

@inyourcorner: Eso es completamente diferente de la definición de la función. El controlador para la asignación sabe verificar los métodos value = en el objeto receptor (el análisis no está involucrado). – cam

1

Eso es analizador/intérprete mágico.

Cuando el intérprete ve que la tarea busca un método coincidente.

Estoy de acuerdo con usted en este sentido (casi), creo que la tarea debe ser some.value= x (sin espacio entre 'valor' y '=') siempre.

Scala hace algo similar, pero utiliza un guión def value_= (x: X)