2010-05-04 15 views
7

Creo recordar Scala métodos de tratamiento que termina en _= especialmente, por lo menos así:métodos que terminan en Scala _ =

object X { var x: Int = 0; def y_=(n : Int) { x = n }} 

X.y = 1 

deben llamar X.y_=(1). Sin embargo, en 2.8.0 RC1, me sale un mensaje de error:

<console>:6: error: value y is not a member of object X 
     X.y = 1 
     ^

Curiosamente, tratando de llamar al método sin paréntesis también falla:

scala> X.y_= 1 
<console>:1: error: ';' expected but integer literal found. 
     X.y_= 1 
      ^

¿Estoy misremembering algo que no existe en realidad o acabo de inventarlo de toda la tela?

Respuesta

13

Este es uno de esos casos de esquina en Scala. No puede tener un colocador sin un captador y viceversa .

Los siguientes trabajos finos:

scala> object X { 
    | var x: Int = 0 
    | def y = x 
    | def y_=(n: Int) { x = n } 
    | } 
defined module X 

scala> X.y = 45 

scala> X.y 
res0: Int = 45 
+1

Ah, gracias! Trataré de recordarlo esta vez. –

+1

Sin duda puede tener el accesorio sin el mutador, simplemente no es un mutador sin un accesorio correspondiente. –

+0

@Randall: Gracias, corregido. (No sé en qué estaba pensando cuando lo escribí). – missingfaktor

3
scala> object X { var x: Int = 0; def y_=(n : Int) { x = n }} 
defined module X 

scala> 

scala> X y_= 1 

scala> X.x 
res1: Int = 1 

scala> object X { var x: Int = _; def y = x ; def y_=(n: Int) { x = n } } 
defined module X 

scala> X.y = 1 

scala> X.y 
res2: Int = 1 

scala> 
Cuestiones relacionadas