Scala LinkedList代码的说明

时间:2015-05-20 13:07:29

标签: scala

我在Scala中找到了从头开始构建var document = require('jsdom').jsdom(); var svg = d3.select(document.body).html('').append('svg') 的代码示例,我无法理解示例中的最后一行。这是一个例子:

LinkedList

我不明白为什么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 打印" XYZ"。事实上,鉴于给定list.tail.head的定义,我无法推断出list.tail.head应该打印先验的内容。任何理解正在发生的事情的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

请记住,使用val定义的构造函数参数是公共成员,因此可以访问(看看here)。引用链接:

  

如果该字段是val,则Scala仅为其生成[public] getter方法。

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"