2013-08-25 9 views
17

Perché queue.get() restituisce l'elenco empy?Scala. Ottieni il primo elemento dell'elenco

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

Come posso ottenere il primo elemento?

+3

Mentre stai imparando, potresti trovare utile scrivere esplicitamente più tipi di quelli necessari. In questo caso, se avessi scritto 'def get(): Int {this.queue.head}' il compilatore ti avrebbe detto che c'era un problema con il metodo 'get'. –

risposta

24

Non restituisce la lista vuota, restituisce Unit (una tupla zero), che è l'equivalente di Scala di void in Java. Se restituisse la lista vuota, vedresti List() stampata sulla console anziché su () (tupla nulla).

Il problema è che stai usando la sintassi sbagliata per il tuo metodo get. È necessario utilizzare un = per indicare che get restituisce un valore:

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

O questo è probabilmente ancora meglio:

def get = this.queue.head 

In Scala di solito lasciare fuori le parentesi (lista parametri) per le funzioni nullaria che non hanno effetti collaterali, ma questo richiede di lasciare le parentesi fuori quando si chiama queue.get pure.

Si potrebbe dare un'occhiata veloce allo Scala Style Guide, in particolare lo section on methods.

+3

A causa di tali errori, è in corso una discussione sulla sintassi della procedura deprecating 'def proc (...) {...}' a favore di full form 'def proc (...): Unit = {...}' . Vedi https://groups.google.com/forum/?fromgroups=#!topic/scala-debate/8G3WgfZNj9E – ghik

2

A volte può essere buono da utilizzare

prendere 1

invece di testa, perché non causa un'eccezione di liste vuote e restituisce ancora una volta una lista vuota.

+7

'headOption' è migliore, perché non usa costanti magiche (1) e restituisce un tipo ('Opzione [T]') che è staticamente garantito di dimensione massima 1. –

Problemi correlati