如何解决初始化辅助函数中的变量
| 有时我正在建立一个我想在其中添加reset
函数的类。例如
class DFA(val initialState:State) {
var states = Map[State,State]()
var currentState: State = initialState
reset
def reset {currentState = initialState}
}
糟糕!您的DRY铃铛没有响吗?我将currentState
设置为initialState
两次。一次在reset
中,一次在构造函数中。我不能只留下未初始化的ѭ5,否则编译器会抱怨。
我当然可以
class DFA(val initialState:State) {
var states = Map[State,State]()
var evilNullVariableWeMustNeverUse = null
var currentState: State = evilNullVariableWeMustNeverUse
reset
def reset {currentState = initialState}
}
但我认为这样做的缺点是显而易见的。
在这种简单的情况下,还算不错,但是如果您有5个变量或更复杂的逻辑,它将变得令人讨厌。
我该如何设计?
解决方法
也许创建一个Resettable包装器?
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\"
存储在另一个变量中即可进行重置。
,使它成为不可变的,并使用\“ mutating \”方法返回一个新实例。
然后,如果您知道您可能需要在某个时候返回到初始状态,只需确保已按最初配置对对象的引用即可。
,class DFA(var initialState:State) {
var states = Map[State,State]()
var currentState: State = _
var reset {currentState = initialState}
reset
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。