Инициализация переменных в вспомогательной функции - PullRequest
1 голос
/ 26 мая 2011

Иногда я создаю класс, в который я хочу добавить функцию reset. Например,

class DFA(val initialState:State) {
    var states = Map[State,State]()
    var currentState: State = initialState
    reset
    def reset {currentState = initialState}
}

Oops! Разве ваши СУХИЕ колокола не звенят? Я устанавливаю currentState на initialState дважды. Один раз в reset и один раз в конструкторе. Я не могу просто оставить var неинициализированным, иначе компилятор будет жаловаться.

Конечно, я мог бы

class DFA(val initialState:State) {
    var states = Map[State,State]()
    var evilNullVariableWeMustNeverUse = null
    var currentState: State = evilNullVariableWeMustNeverUse
    reset
    def reset {currentState = initialState}
}

но я думаю, что обратная сторона этого очевидна.

В этом простом случае все не так плохо, но если у вас есть 5 переменных или более сложная логика, это становится неприятным.

Как мне с этим справиться?

Ответы [ 3 ]

3 голосов
/ 26 мая 2011

Может быть создать Resettable wrapper?

class Resettable[T](initial: T) {
  var value: T = initial
  def reset = value = initial
  def :=(other: T) = value = other
}

object Resettable {
  implicit def resettable[T](initial: T) = new Resettable(initial)
  implicit def fromResettable[T](r: Resettable[T]) = r.value
}

Затем:

class DFA(initialState:State) {
    var states = Map[State,State]()
    var currentState: Resettable[State] = initialState
    def changeState(other: State)  = currentState := other

    def reset = currentState.reset
}

И:

val dfa = new DFA(new State)
val t: State = dfa.currentState

Преимущества можно увидеть с помощью:

class Something {
   val a: Resettable[Int] = 0
   val b: Resettable[String] = "hi"
}

Нет необходимости хранить 0 и "hi" в другой переменной для сброса.

2 голосов
/ 26 мая 2011

Сделайте его неизменным, и методы "мутирования" возвращают новый экземпляр.

Затем, если вы знаете, что в какой-то момент вам может понадобиться вернуться к исходному состоянию, просто убедитесь, что вы сохранили ссылку на объект, как было изначально настроено.

1 голос
/ 26 мая 2011
class DFA(var initialState:State) {
    var states = Map[State,State]()
    var currentState: State = _
    var reset {currentState = initialState}
    reset
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...