2017-02-06 8 views
5

Ich habe die folgenden 2 Code-Schnipsel; der erste gibt mir keine Probleme, aber für den zweiten (der an die Liste in einer Funktion angehängt wird), erhalte ich eine Fehlermeldung. Was ist der Unterschied zwischen diesen 2 und wie repariere ich den zweiten?Scala: Ein Element an eine Liste anhängen

Dieses funktioniert gut:

object MyApp extends App 
{ 
    var myList = List.range (1, 6) 
    myList ::= 6  
    println(myList) 
} 

Dies funktioniert nicht:

def myFunc(list:List[Int]):Unit = 
    { 
     list ::= 10 
    } 


error: value ::= is not a member of List[Int] 
     list ::= 10 
      ^
one error found 

Antwort

2

Ich gehe davon aus, dass Sie ein Java-Programmierer sind, und deshalb haben Sie ein Problem zu verstehen, was das Problem ist. Wenn Sie in Java versuchen, die Liste selbst in einer Methode zu ändern, können Sie dies tun, da keine neue Sammlung erstellt wird. Es ist die gleiche Sammlung mit einem Element hinzugefügt.

In Scala jedoch, da die Liste selbst nicht änderbar ist, muss eine völlig neue Liste erstellt werden, und daher ist eine Neuzuordnung zu der auf die Liste zeigenden Variablen erforderlich. Da in Scala die übergebenen Argumente val sind, verursacht diese Neuzuweisung das Problem. In Ihrem ersten Code wird eine neue Liste erstellt, aber da die Liste eine Variable ist, verursacht diese Neuzuweisung kein Problem.

Wenn die Liste selbst änderbar wäre, hätten Sie auch in Ihrem zweiten Codeblock kein Problem, da Sie die Liste nicht neu zuordnen müssen. Um den Punkt zu beweisen, verwenden Sie ListBuffer anstelle von List im zweiten Codeblock, und Sie werden sehen, dass es perfekt funktioniert.

+0

Ich denke, das ist genau das, was mein Problem ist. In Java selbst wenn die Variable, die auf die Liste verweist, endgültig ist, würde dies immer noch kein Problem verursachen, da die List-Klasse veränderbar ist. – user1888243

6

Variablen markiert mit var sind wandelbar und so können neu zugewiesen werden. Der a ::= b Operator ist einfach syntactic sugar, bereitgestellt von dem Compiler für var Variablen. Es führt die Operation a = b :: a aus. Hier ein Beispiel:

scala> var l1 = List(1,2,3) 
l1: List[Int] = List(1, 2, 3) 

scala> l1 ::= 4 

scala> l1 
res1: List[Int] = List(4, 1, 2, 3) 

scala> val l2 = List(1,2,3) 
l2: List[Int] = List(1, 2, 3) 

scala> l2 ::= 4 
<console>:9: error: value ::= is not a member of List[Int] 
       l2 ::= 4 
       ^
scala> val l3 = 4 :: l2 
l3: List[Int] = List(4, 1, 2, 3) 

gebenen Parameter nicht wandelbar sind, so dass der ::= Operator nicht verwendet werden kann.

+1

So ist die Fehlermeldung "value :: = ist kein Mitglied der Liste" falsch, oder zumindest nicht so hilfreich. Es sollte sagen, dass etwas wie Liste unveränderlich ist und daher nicht zugeordnet werden kann. Ich meine :: hat nicht plötzlich aufgehört, ein Operator zu sein, der auf der Liste verwendet werden kann. – user1888243

+2

Ich denke, es könnte nützlicher sein, aber es ist nicht falsch. ':: =' ist niemals ein Element von 'List', sondern wird vom Compiler in' a = b :: a' übersetzt. –

Verwandte Themen