Взято из Как в Scala вы объявляете статические данные внутри функции? .Не используйте метод, но объект функции:
val init = { // or lazy val
var inited = false
(config: Config) => {
if (inited)
throw new IllegalStateException
inited = true
}
}
Во время инициализации внешней области (в случае val
) или первого доступа (lazy val
) выполняется тело переменной,Таким образом, inited
устанавливается на false
.Последнее выражение является анонимной функцией, которая затем присваивается init
.Каждый последующий доступ к init
будет затем выполнять эту анонимную функцию.
Обратите внимание, что она не ведет себя точно как метод.Т.е. совершенно правильно называть это без аргументов.Затем он будет вести себя как метод с последующим подчеркиванием method _
, что означает, что он просто вернет анонимную функцию без жалоб.
Если по той или иной причине вам действительно нужно поведение метода, вы можете сделать этоprivate val _init = ...
и позвоните по телефону def init(config: Config) = _init(config)
.