Aufgenommen von In Scala, how would you declare static data inside a function?. Kein Verfahren, sondern ein Funktionsobjekt verwenden:
val init = { // or lazy val
var inited = false
(config: Config) => {
if (inited)
throw new IllegalStateException
inited = true
}
}
Während der Initialisierung des äußeren Umfangs (im Fall von val
) oder den ersten Zugang (lazy val
), wird der Körper der Variablen ausgeführt. Daher wird inited
auf false
festgelegt. Der letzte Ausdruck ist eine anonyme Funktion, die dann init
zugewiesen wird. Jeder weitere Zugriff auf init
führt dann diese anonyme Funktion aus.
Beachten Sie, dass es sich nicht genau wie eine Methode verhält. I.e. es ist durchaus zulässig, es ohne Argumente zu nennen. Es wird sich dann wie eine Methode mit dem abschließenden Unterstrich method _
verhalten, was bedeutet, dass es nur die anonyme Funktion zurückgibt, ohne sich zu beschweren.
Wenn Sie aus irgendeinem Grund tatsächlich ein Methodenverhalten benötigen, können Sie es zu einem private val _init = ...
machen und es aus dem öffentlichen def init(config: Config) = _init(config)
aufrufen.
Siehe auch http://StackOverflow.com/questions/1516087 – Debilski