2017-02-06 13 views
5

У меня есть следующие 2 фрагмента кода; первый из них не дает мне никаких проблем, но для второго (добавление к списку в функции) у меня появляется сообщение об ошибке. В чем разница между этими двумя, и как я могу исправить вторую?Scala: Добавление элемента в список

Это один работает отлично:

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

Это не работает:

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


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

ответ

2

Я предполагаю, что вы программист на Java, и именно поэтому у вас возникла проблема, чтобы понять, в чем проблема. В Java, если вы попытаетесь изменить список, даже в методе, вы сможете это сделать, поскольку новая коллекция не создается; это же коллекция с добавленным элементом.

Однако в Scala, поскольку сам список не изменен, необходимо создать совершенно новый список, и поэтому требуется переназначение переменной, указывающей на список. Поскольку в Scala переданные аргументы являются val, это переназначение вызывает проблему. В вашем первом коде создается новый список, но поскольку list является var, то это переназначение не вызывает проблем.

Если сам Список был изменен, тогда у вас не было бы проблем во втором блоке кода, так как вам не нужно было переназначать список. Чтобы доказать это, используйте ListBuffer вместо List во втором блоке кода, и вы увидите, что он работает отлично.

+0

Я думаю, что это именно то, что моя проблема. В Java, даже если переменная, указывающая на список, является окончательной, это все равно не вызовет никаких проблем, поскольку класс List изменен. – user1888243

6

Переменные, отмеченные var изменчивы и поэтому могут быть переназначены. Оператор a ::= b - это просто syntactic sugar, предоставленный компилятором для var переменными. Он выполняет операцию a = b :: a. Ниже приведен пример:

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) 

Передаваемые параметры не изменяемые поэтому оператор ::= не может быть использован.

+1

Таким образом, сообщение об ошибке «значение :: = не является членом списка» неверно или, по крайней мере, не так полезно. Надо сказать, что что-то вроде списка является неизменным и, следовательно, не может быть назначено. Я имею в виду: не переставал быть оператором, который можно использовать в Списке. – user1888243

+2

Я полагаю, что это может быть более полезно, но это не так. ':: =' никогда не является элементом 'List', но он переводится в' a = b :: a' компилятором. –

 Смежные вопросы

  • Нет связанных вопросов^_^