2014-10-15 2 views
1

Верно ли, что применение оператора list1 ::: list2 к двум спискам соответствует добавлению всего содержимого list1 к list2?Scala: понимание оператора :::

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

scala> val b = List(4,5,6) 
b: List[Int] = List(4, 5, 6) 

scala> a:::b 
res0: List[Int] = List(1, 2, 3, 4, 5, 6) 

Есть ли другие функции для этого оператора? Я не мог найти ничего на ::: в документации Scala, и мне интересно, насколько его формальное имя и использование.

+0

Да, похоже, это всего лишь список-конкатенация - нашел это: http://www.tutorialspoint.com/scala/scala_lists.htm - и да, это просто так: – Carsten

+1

Вы посмотрели [ссылку API для 'List' ] (http://www.scala-lang.org/api/current/#scala.collection.immutable.List)? –

+0

Возможный дубликат [Конкатенация списка Scala, ::: vs ++] (http://stackoverflow.com/questions/6559996/scala-list-concatenation-vs) –

ответ

4

Да, это всего лишь оператор конкатенации списка. Они представляют собой нисходящие связанные списки, поэтому концептуально все, что он действительно делает, - это взять последнюю ячейку cons из первого списка и направить ее в голову второго списка вместо Nil.

Вы также можете использовать более общий оператор ++ вместо :::, если хотите. Конечный результат тот же, но технически вы делаете вызовы на разные объекты. Операторы, оканчивающиеся на a: являются правильными ассоциативными в Scala, поэтому использование a ++ b такое же, как. ++ (b) или в основном a.append (b), в отличие от a :: b, являющегося правильным ассоциативным, переводится в b . :: :(a), который можно читать как b.prepend (a).

+0

Это упрощение несколько неискреннее, поскольку оно скрывает линейное время выполнения. –

+0

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

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