2012-02-20 6 views
10

¿Puedo usar múltiples parámetros en setters?Scala setters - multiple parameters

Por ejemplo:

private var _a = 0 
def a = _a 
def a_= (b: Int, c: Int) = _a = b + c 

En caso afirmativo, ¿cómo puedo llamar al método de selección?

+0

Las tuplas son buenas. También considere usar el método 'update()', p. Ej. 'def update (p1: T1, p2: T2, p3: T3, v: V)' luego puedes escribir 'obj (p1, p2, p3) = v' – tuxSlayer

+0

Y sí, todavía puedes llamarlo' obj.a_ = (1, 2) 'pero probablemente no es un 'setter';) – tuxSlayer

Respuesta

9

¿Qué tal una tupla?

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    _a = t._1 + t._2 
    } 
} 

Si no te gusta incómoda sintaxis de acceso tupla:

class A { 
    private var _a = 0 
    def a = _a 
    def a_= (t: (Int, Int)) { 
    t match { 
     case(b, c) => _a = b + c 
    } 
    } 
} 

Uso:

val x = new A() 
x.a = (3, 7) 
x.a //10 
+0

Ejemplo de cómo se llama esto? (Nunca he sido capaz de hacer que esto funcione bien ... al menos en [el ahora antiguo] 2.8.) –

+0

@pst: agregó un ejemplo, parece funcionar (?) –

+0

Hurra por el progreso :) –

1

Si es necesario establecer un único valor de otros dos valores que probablemente no es una 'setter'. Considere darle a esta operación un nombre significativo o sacarla de esta clase.

private var _s: Whatever = // init 
def s_=(newValue: Whatever): Unit = _setter = newValue 
... 
implicit def t2whatever(t: (SomeTypeA, SomeTypeB)): Whatever = // some logic here 

ahora nos Cal llame a nuestro colocador

obj.setter = sta -> stb 
// or 
obj.setter = (sta, stb) 

que es más o menos lo mismo que con tuplas de civil, sin embargo, no es semántica colocador destrozado.

En caso de que sus operaciones internas pueden ser:

class Z { 
    private var _s = // init 

    def s = _s 
    def s_=(newValue: S) = _s = newValue 
} 

object Z { 
    def toS(a: S, b: S): S = ChineseZodiac.choose(0.14 * a, math.PI + b) 
} 

y luego

obj.s = Z.toS(1, 2) 
+0

Gracias. Entiendo que la semántica setter podría cambiarse, pero a veces uso ese setter en un pequeño código, y parece ser más fácil si no divido ese código en otro objeto o clase ... –