2011-02-14 7 views

Respuesta

13

En este momento, no, no hay forma de hacerlo.

que está limitado a la solución de tres líneas siguientes:

class Hider { 
    private[this] var xHidden: Int = 0 
    def x = xHidden 
    private def x_=(x0: Int) { xHidden = x0 } 
} 

Ahora la clase en sí es el único que puede manipular el campo subyacente xHidden, mientras que otras instancias de la clase pueden utilizar el método setter y todos pueden ver el método getter.

Si no te importa utilizar nombres diferentes, puedes hacer que la var sea privada y olvidarte del setter (dos líneas).

No hay palabra clave "var to me, val to them".

+0

¿Se discutió la posibilidad de tal palabra clave en la comunidad de Scala? –

+3

@ Łukasz - No mientras he estado escuchando, no donde he estado escuchando. (No escucho en todas partes y no he estado aquí para siempre, sin embargo). Pero sospecho que no recibiría mucho favor, ya que hay un fuerte énfasis en mantener la definición de lenguaje pequeña (es decir, pocos casos especiales, incluso si los casos que tienes te dan un gran poder expresivo), y al favorecer las soluciones inmutables sobre las mutables. –

3

Se podría hacer algo como:

class Test { 
    private var myprivatevar = "" 

    def publicvar = myprivatevar 
} 

de las otras clases, que sería capaz de utilizar solamente publicvar y ya que no hay publicvar_= método, no se puede asignar a la misma desde el exterior.

+0

¿Quieres decir que no es posible hacerlo con un modificador? –

+0

También en su solución tengo que encontrar diferentes nombres para var y def, ¿o no? –

+0

No puede reutilizar el nombre (en mi caso, 'myprivatevar') ya que Scala crea implícitamente un (en este caso, privado) getter y setter para la variable; si intentas hacer un 'def myprivatevar = this.myprivatevar' obtendrías un choque de nombre ya que el método está definido dos veces. – andri

-1

Ciertamente se convierte algo en var y luego se vuelve privado para la clase que define el campo.

scala> class Holder(private var someValue: String) {  
    | def getValueOfOther(other: Holder) = other.someValue 
    | def combinedWith(holder: Holder) = new Holder(holder1.someValue + " " + holder2.someValue) 
    | def value = someValue 
    | } 
defined class Holder 

scala> val holder1 = new Holder("foo")             
holder1: Holder = [email protected] 

scala> val holder2 = new Holder("bar")             
holder2: Holder = [email protected] 

scala> holder2.getValueOfOther(holder1)             
res5: String = foo 

scala> val holder3 = holder1 combinedWith holder2 
holder3: Holder = [email protected] 

scala> holder3.value 
res6: String = foo bar 
Cuestiones relacionadas