Почему я не могу использовать :: после списка, чтобы добавить к нему строку в Scala? - PullRequest
0 голосов
/ 29 марта 2012

Итак, я предполагаю, что моя проблема связана с тем, что происходит под капотом, но я не понимаю, почему это не работает:

scala> b = b :: "apple";
<console>:8: error: value :: is not a member of java.lang.String

но это делает:

scala> b = "apple" :: b;
b: List[java.lang.String] = List(apple, pear)

Спасибо.

Ответы [ 3 ]

8 голосов
/ 29 марта 2012

Имена методов, оканчивающиеся на :, ассоциативно справа, поэтому b :: "apple" пытается вызвать метод :: для String, которого не существует.

Нормальная стратегия добавления вещей, еслиВы должны использовать List, чтобы добавить вещи в начало, а затем reverse результат, когда вы закончите.Но, как говорит Рекс, лучше использовать Вектор.

6 голосов
/ 29 марта 2012

:: всегда присоединяет новый элемент к началу списка.Добавление элемента в конец может быть выполнено, но это занимает время, пропорциональное длине списка (поскольку весь список должен быть не только пройден, но фактически перестроен).

Если вам действительно нужно добавитьэлемент до конца списка, используйте :+:

List("pear","orange") :+ "apple"

Еще лучше, используйте Vector, когда вам нужно добавить в конец (это намного быстрее при двусторонних добавлениях):

Vector("grape","peach") :+ "apple"
0 голосов
/ 29 марта 2012

Другая возможность заключается в явном добавлении Nil в конец цепочки:

scala> val a = "apple"
a: java.lang.String = apple

scala> val b = "pear"
b: java.lang.String = pear

scala> a::b::Nil
res0: List[java.lang.String] = List(apple, pear)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...