2013-08-25 21 views
17

Dlaczego queue.get() zwraca listę empy?Scala. Pobierz pierwszy element listy

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

Jak mogę uzyskać pierwszy element?

+3

Podczas nauki może okazać się przydatne wyraźne zapisanie większej liczby typów niż jest to konieczne. W takim przypadku, gdybyś napisał 'def get(): Int {this.queue.head}' kompilator powiedziałby, że wystąpił problem z metodą 'get'. –

Odpowiedz

24

Nie zwraca pustej listy, to zwraca Unit (zero-tuple), która jest odpowiednikiem Scala void w Javie. Jeśli zwróci pustą listę, zostanie wyświetlona List() wydrukowana na konsoli zamiast () (krotka null).

Problem polega na użyciu niewłaściwej składni metody get. Trzeba użyć = aby wskazać, że get zwraca wartość:

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

Albo to chyba nawet lepiej:

def get = this.queue.head 

W Scala zazwyczaj pozostawić poza nawiasy (lista parametrów) dla funkcji sygnalnych które nie mają żadnych skutków ubocznych, ale wymaga to wyłączenia nawiasów, gdy zadzwonisz pod numer queue.get.

Możesz rzucić okiem na Scala Style Guide, a konkretnie na section on methods.

+3

Z powodu takich błędów trwa dyskusja na temat deprecjonowania składni procedury 'def proc (...) {...}' na korzyść pełnej formy 'def proc (...): Unit = {...}' . Zobacz https://groups.google.com/forum/?fromgroups=#!topic/scala-debate/8G3WgfZNj9E – ghik

2

Czasami może to być dobry w użyciu

wziąć 1

zamiast głowy, bo robi to spowodować wyjątek na pustych list i zwraca ponownie pustą listę.

+7

'headOption' jest lepszy, ponieważ nie używa żadnych magicznych stałych (1) i zwraca typ ('Opcja [T]'), która ma statyczną gwarancję, że ma maksymalny rozmiar 1. –