Почему в коллекциях scala нет удобочитаемых методов, таких как .append, .push и т. д.

В коллекциях Scala есть куча удобочитаемых и почти удобочитаемых операторов, таких как :+ и +:, но почему нет удобочитаемых синонимов, таких как append?


person F0RR    schedule 24.08.2011    source источник


Ответы (5)


Все коллекции mutable в Scala имеют BufferLike и определяет метод append.

Неизменяемые коллекции не имеют трейта BufferLike и, следовательно, определяют только другие методы, которые не изменяют существующую коллекцию, а создают новую.

person Maurício Linhares    schedule 24.08.2011
comment
Да, но почему? Я могу жить с Seq, который возвращает новый Seq после append. Почему бы не добавить такие псевдонимы, хотя бы для облегчения взаимодействия с Java. - person F0RR; 24.08.2011
comment
Семантика, добавление в Java используется для различных классов буферов, таких как StringBuffer и StringBuilder, когда вы используете добавление, вы ожидаете, что оно будет добавляться к текущему объекту, а не создавать новый объект. Определив метод append, который создает новый объект, вы нарушаете это ожидание, что совсем нехорошо. - person Maurício Linhares; 24.08.2011

Имена символических методов допускают комбинацию с операцией присваивания =.

Например, если у вас есть метод ++, создающий новую коллекцию, вы можете автоматически использовать ++= для присвоения новой коллекции какой-либо переменной:

var array = Array(1,2,3)
array ++= Array(4,5,6)
// array is now Array(1,2,3,4,5,6)

Это невозможно без символических имен методов.

person soc    schedule 24.08.2011

На самом деле они часто являются удобочитаемыми синонимами:

  • foldLeft эквивалентно /:
  • foldRight эквивалентно :\

Остальные являются операторами сложения, которые вполне удобочитаемы для человека:

  • ++ эквивалентен Java addAll
  • :+ добавляется
  • +: добавляется

Положение точки с запятой указывает экземпляр получателя.

Наконец, некоторые странные операторы являются наследием других языков функционального программирования. Например, построение списка (SML) или обмен сообщениями между актерами (erlang).

person paradigmatic    schedule 24.08.2011
comment
Я не уверен, что :+ и append это одно и то же. Я думаю, что первый (из SeqLike) создает новую коллекцию, а второй (из BufferLike) изменяет буфер на месте. - person Kipton Barros; 25.08.2011
comment
Да, у них разная семантика в Scala, но это все равно операция добавления. - person paradigmatic; 25.08.2011

Отличается ли он от любого другого языка?

Возьмем Яву. Какая удобочитаемая версия +, -, * и / на int? Или возьмем String: какая удобочитаемая версия +? Обратите внимание, что concat — это не одно и то же — он не принимает параметры, отличные от String.

Возможно, вас это беспокоит, потому что в Java — в отличие, скажем, от C++ — используются либо исключительно неалфавитные операторы, либо алфавитные операторы — за исключением String в +.

person Daniel C. Sobral    schedule 25.08.2011

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

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

По той же теме я помню некоторые споры о том, должны ли коллекции 2.8 реализовывать java.util.Iterable.

http://scala-programming-language.1934581.n4.nabble.com/How-to-set-the-scale-for-scala-BigDecimal-s-method-td1948885.html

http://www.scala-lang.org/node/2177

person retronym    schedule 24.08.2011