2014-12-14 5 views
0

Я пытаюсь определить объект User, который расширяет черту. Черта содержит набор пользовательских объектов. Когда я пытаюсь создать нового пользователя. Я получаю ошибку Stackoverflow, я не могу понять, почемуОшибка StackoverFlow при создании объекта self

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

case class User(email:String) extends userTrait 


trait userTrait { 
    self:User => 
    val administrators = new User("[email protected]")::new User("[email protected]")::Nil 
    def isAdminstrator = administrators.contains(this) 
} 

// Exiting paste mode, now interpreting. 

defined class User 
defined trait userTrait 

scala> new User("test") 
java.lang.StackOverflowError 
    ... 1024 elided 
+3

При создании пользователя с новым пользователем, это initalises администраторов в черте. Что вызывает нового пользователя, который инициализирует администраторов в этом признаке. Что вызывает новый пользователь ..... bang, переполнение стека. Не все очевидно, что вы пытаетесь сделать здесь. –

+0

Я понял. Я хочу, чтобы эта черта содержала набор суперпользователей. Как инициализировать эту коллекцию? – vumaasha

+0

Мне не нравится помещать данные в черты. Я по-прежнему отношусь к ним немного как интерфейсы Java с определенными методами. – goral

ответ

2

У вас здесь циклическое состояние. User extends userTrait (который инициирует инициализацию new User ...)

3

«Как инициализировать эту коллекцию?» Вы можете просто предварять val administrators с lazy

trait userTrait { 
    self: User => 
    /* >>> */ lazy val administrators = 
    new User("[email protected]") :: new User("[email protected]") :: Nil 
    def isAdminstrator = administrators.contains(this) 
} 
case class User(email: String) extends userTrait 

println(new User("test").isAdminstrator) 
// prints false 
println(new User("[email protected]").isAdminstrator) 
// prints true 
Смежные вопросы