2013-08-25 12 views
17

Warum queue.get() Empy-Liste zurückgeben?Scala. Holen Sie sich das erste Element der Liste

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()) 
    } 
} 

Wie ich das erste Element erhalten kann?

+3

Während Sie lernen, könnte es nützlich sein, explizit mehr Typen als nötig zu schreiben. Wenn Sie in diesem Fall 'def get(): Int {this.queue.head}' geschrieben hätten, hätte der Compiler Ihnen gesagt, dass es ein Problem mit der 'get'-Methode gibt. –

Antwort

24

Es gibt nicht die leere Liste zurück, es gibt Unit (ein Zero-Tupel) zurück, das ist Scalas Entsprechung von void in Java. Wenn es die leere Liste zurückgab, würden Sie sehen, List() gedruckt auf der Konsole anstelle der () (Null-Tupel).

Das Problem ist, dass Sie die falsche Syntax für Ihre get Methode verwenden. Sie benötigen einen =, um anzuzeigen, zu verwenden, dass get einen Wert zurückgibt:

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

Oder ist dies wahrscheinlich noch besser:

def get = this.queue.head 

In Scala Sie in der Regel die Klammern wegzulassen (Parameterliste) für nullary Funktionen das hat keine Nebenwirkungen, aber das erfordert, dass Sie die Klammern bei queue.get auch ausschalten.

Sie möchten vielleicht einen kurzen Blick auf die Scala Style Guide werfen, speziell die section on methods.

+3

Aufgrund solcher Fehler gibt es Diskussionen über die ablehnende Prozedursyntax 'def proc (...) {...}' zugunsten der vollständigen Form 'def proc (...): Unit = {...}' . Siehe https://groups.google.com/forum/?fromgroups=#!topic/scala-debate/8G3WgfZNj9E – ghik

2

Manchmal kann es gut sein

1 nehmen

statt Kopf zu verwenden, da es eine Ausnahme auf leere Listen führen tut und gibt wieder eine leere Liste.

+7

'headOption' ist besser, da es keine magischen Konstanten (1) verwendet und einen Typ zurückgibt ('Option [T]') die statisch garantiert die maximale Größe hat 1. –

Verwandte Themen