what trait mixin functions basics scala parameters setter

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)