我在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
应该打印先验的内容。任何理解正在发生的事情的帮助都将受到赞赏。
答案 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"