Scala сеттеры - несколько параметров

Можно ли использовать несколько параметров в сеттерах?

Например:

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)
}

а затем

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