Scala setters - несколько параметров - PullRequest
10 голосов
/ 20 февраля 2012

Могу ли я использовать несколько параметров в установщиках?

Например:

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

Если да, как я могу вызвать метод установки?

Ответы [ 2 ]

9 голосов
/ 20 февраля 2012

А как насчет кортежа?

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
1 голос
/ 22 февраля 2012

Если вам нужно установить одно значение из двух других значений, это, вероятно, не «установщик». Подумайте над тем, чтобы придать этой операции осмысленное имя или убрать ее из этого класса.

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