trait - singleton scala
Scala setters-parámetros múltiples (2)
¿Puedo usar múltiples parámetros en setters?
Por ejemplo:
private var _a = 0
def a = _a
def a_= (b: Int, c: Int) = _a = b + c
Si es así, ¿cómo puedo llamar al método setter?
¿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 la incómoda sintaxis de acceso de 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
Si necesita establecer un valor único a partir de otros dos valores, probablemente no sea un ''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 llamamos a nuestro setter
obj.setter = sta -> stb
// or
obj.setter = (sta, stb)
Que es más o menos lo mismo que con las tuplas simples sin embargo, setter semántica no se destroza.
En caso de que sus operaciones internas en se vean así:
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 entonces
obj.s = Z.toS(1, 2)