Scala. 获取List的第一个元素

30

为什么queue.get()会返回一个空列表?

class MyQueue{
  var queue=List[Int](3,5,7)

  def get(){
    this.queue.head
  }
}

object QueueOperator {
  def main(args: Array[String]) {
    val queue=new MyQueue
    println(queue.get())
  }
}

如何获取第一个元素?


3
在学习过程中,你可能会发现将比必要更多的类型明确地写出来是有用的。假设你写了“def get(): Int { this.queue.head }”,那么编译器会告诉你get方法存在问题。 - Chris Martin
2个回答

41
它没有返回空列表,而是返回了Unit(零元组),这是Scala中等同于Java的void。如果它返回的是空列表,你会在控制台上看到List()而不是()(无参数元组)。
问题在于你在get方法中使用了错误的语法。你需要使用=来表示get返回一个值:
def get() = {
  this.queue.head
}

或者这可能更好:

def get = this.queue.head

在Scala中,通常省略没有副作用的零元函数的括号(参数列表),但这也要求你在调用queue.get时省略括号。你可能想快速查看一下Scala风格指南,特别是方法部分

3
由于存在这样的错误,关于弃用过程语法def proc(...) { ... },转而采用完整形式def proc(...): Unit = { ... }的讨论正在进行中。请参见https://groups.google.com/forum/?fromgroups=#!topic/scala-debate/8G3WgfZNj9E。 - ghik

2
有时候使用 take 1 而不是 head 更加优秀,因为它不会在空列表上引发异常,并且会返回一个空列表。

14
headOption更好,因为它不使用任何魔法常量(1),并且返回的类型(Option[T])在编译期就可以被静态保证最大容量为1。 - Robin Green

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接