Можно ли использовать несколько параметров в сеттерах?
Например:
private var _a = 0
def a = _a
def a_= (b: Int, c: Int) = _a = b + c
Если да, как я могу вызвать метод setter?
Ответ 1
Как насчет кортежа?
class A {
private var _a = 0
def a = _a
def a_= (t: (Int, Int)) {
_a = t._1 + t._2
}
}
Если вам не нравится синтаксис доступа неудобного кортежа:
class A {
private var _a = 0
def a = _a
def a_= (t: (Int, Int)) {
t match {
case(b, c) => _a = b + c
}
}
}
Использование:
val x = new A()
x.a = (3, 7)
x.a //10
Ответ 2
Если вам нужно установить одно значение из двух других значений, это, вероятно, не "сеттер". Подумайте о том, чтобы дать этой операции значащее имя или вывести его из этого класса.
private var _s: Whatever = // init
def s_=(newValue: Whatever): Unit = _setter = newValue
...
implicit def t2whatever(t: (SomeTypeA, SomeTypeB)): Whatever = // some logic here
теперь мы называем наш сеттер
obj.setter = sta -> stb
// or
obj.setter = (sta, stb)
Что более или менее то же самое, что и для простых кортежей, семантик семантики не искажен.
В случае, если его внутренние операции могут выглядеть так:
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)
}