空列表的 Scala 头

Scala head of empty List

我想获取我的第一个元素:

var stack = List[Map[String, ExpValue]]()

尽管我这样做了,但我怎么可能总是收到它是空的错误消息:

if (stack.isEmpty) { 
var new_map:Map[String, ExpValue] = Map(); 
new_map::stack;}
var x = stack.head

基本上如果它是空的就添加一个元素。 为什么head总是空的?

在列表前添加元素不会改变列表,它会创建一个新列表,其中包含新元素,后跟原始列表的元素。在这种情况下,您可以将 new_map :: stack 的结果分配给您的 stack 变量:

var stack = List[Map[String, ExpValue]]()
if (stack.isEmpty) {
  var new_map: Map[String, ExpValue] = Map();
  stack = new_map :: stack;
}
var x = stack.head

价值观有许多不同的形式,但处理它们的机制是相同的。例如,考虑以下代码段

中操作 +:: 的行为
val x: Int = 41
1 + x
x 
// res0: Int = 41 

val l: List[Int] = List(41)
1 :: l
l
// res1: List[Int] = List(41)

List(41) 是一个相同意义上的值 41 是一个值,而 res1 仍然是 List(41) 而不是 List(1, 41) 出于同样的原因 res0 仍然是 41 而不是 42.

将此概念应用于您的代码段(稍微简化后)

val stack: List[Map[String, Int]] = List()
Map() :: stack
stack
// res2: List[Map[String,Int]] = List()

你能看出为什么 res2 仍然是 List() 而不是 List(Map()) 吗?