#scala
#scala
Вопрос:
Я работаю над «Программированием в Scala (первое издание)», и я добрался до некоторых методов списка. Есть два метода, которые он называет, которые выдают мне ошибку в интерактивной оболочке: удалить и отсортировать. Вот примеры, которые он дает:
val thrill = "will" :: "fill" :: "until" :: Nil
thrill.sort((a, b) a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)
thrill.remove(s => s.length == 4)
Когда я пытаюсь использовать их в консоли, я получаю ошибки, которые эти методы не являются « a member of List[String]
«:
scala> util.Properties.versionString
res41: String = version 2.11.1
scala> val myList = "one" :: "two" :: "three" :: "four" :: Nil
myList: List[String] = List(one, two, three, four)
scala> myList.sort((a, b) => a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)
<console>:9: error: value sort is not a member of List[String]
myList.sort((a, b) => a.charAt(0).toLowerCase < b.charAt(0).toLowerCase)
^
scala> thrill.remove(s => s.length == 5)
<console>:9: error: value remove is not a member of List[String]
thrill.remove(s => s.length == 5)
Поэтому я подумал, что, возможно, я использую более новую версию (поскольку эта книга, похоже, написана несколько лет назад), и я обратился к документации по списку. Оба метода, по-видимому, присутствуют в версии 2.7.7 (самой новой, которую я смог найти). Как вы можете видеть, я использую 2.11.1.
Были ли эти методы удалены из API списков с 2.7.7, или я использую их неправильно?
Комментарии:
1. Странно, что 2.7 — это новейшая документация, которую вы можете найти, моя версия всплывающих окон Google, последняя версия scala
Ответ №1:
В темные времена scala 2.7 (это было более четырех лет назад!) ваш код будет работать просто отлично, но теперь, с 2.8 , вам придется использовать разные имена для remove
и sort
:
import Character.{toLowerCase => lower}
myList.sortWith { case (a, b) => lower(a.charAt(0)) < lower(b.charAt(0)) }
// List(four, one, two, three)
Существует также .sorted для сортировки по умолчанию
List(2, 5, 3).sorted
// res10: List[Int] = List(2, 3, 5)
и .sortBy(x => …) для сортировки с некоторой подготовкой (это похоже на сортировку с помощью эфемерной карты):
val foo = List("ac", "aa", "ab")
foo.sortBy(x => x.charAt(1))
// res6: List[String] = List(aa, ab, ac)
И remove был заменен на filterNot (хотя, я думаю, что remove — более удобное имя, даже если это заставляет вас думать, что коллекция изменчива, что обманывает Ven в его ответе):
thrill.filterNot(s => s.length == 5)
// res9: List[String] = List(will, fill)
Существует также .filter, который делает обратное:
thrill.filter(s => s.length == 5)
// res11: List[String] = List(until)
Это можно увидеть гораздо чаще в коде scala.