2015-05-20 3 views
0

Я нашел пример построения кода LinkedList с нуля в Scala, и я не мог понять последнюю строку в примере. Вот пример:Объяснение Scala LinkedList code

scala> class MyList (val head : Any, val tail : MyList) { 
    | def isEmpty = (head == null && tail == null) 
    | def length : Int = if (isEmpty) 0 else 1 + tail.length 
    | override def toString: String = if (isEmpty) "" else head + " " + tail 
    | } 
defined class MyList 

scala> var list = new MyList (null, null) 
list: MyList = 

scala> list.length 
res3: Int = 0 

scala> list.isEmpty 
res4: Boolean = true 

scala> list = new MyList ("ABC", list) 
list: MyList = ABC 

scala> list.length 
res5: Int = 1 

scala> list.isEmpty 
res6: Boolean = false 

scala> list = new MyList("XYZ", list) 
list: MyList = XYZ ABC 

scala> list = new MyList ("123", list) 
list: MyList = 123 XYZ ABC 

scala> list.tail.head 
res7: Any = XYZ 

Я не понимаю, почему list.tail.head печатает "XYZ". На самом деле я не могу объяснить, что list.tail.head должен печатать априори с учетом определения class MyList, как указано. Любая помощь в понимании происходящего будет оценена по достоинству.

ответ

1

Помните, что параметры конструктора, определенные с помощью val, являются общедоступными и, следовательно, доступны (посмотрите here). Цитата из ссылки:

Если поле является val, Scala генерирует только [общедоступный] метод получения.

head содержит один элемент, который мы рассмотрим первый, tail другой список элементов, которые мы считаем хвост. Это рекурсивная структура, в которой экземпляр объекта содержит ссылку на другой экземпляр одного и того же объекта.

В вашем примере, после того, как вы создали список после того, как с другой стороны, это как у вас есть (это не фактический код):

MyList(
    head = "123" 
    tail = MyList(
    head = "XYZ" 
    tail = MyList(
     head = "ABC" 
     tail = MyList(
     head = null 
     tail = null 
    ) 
    ) 
) 
) 

list.tail = MyList(
    head = "XYZ" 
    tail = MyList(
    head = "ABC" 
    tail = MyList(
     head = null 
     tail = null 
    ) 
) 
) 

list.tail.head = "XYZ" 
+0

Ах! Я не знал, что параметры конструктора автоматически определяют публичные члены. И запись структуры данных MyList в конце помогла прояснить картину очень. благодаря!! shouldnt последний хвост будет хвостом = MyList (head = null tail = null). если да, то, если вы сделаете это редактирование, я могу принять ваш ответ. – algorithmic

+0

Они определяют геттеры и/или сеттеры, если вы используете 'val' или' var' в определении, иначе нет. Да, я должен это исправить – ColOfAbRiX

Смежные вопросы