В коллекциях Scala есть куча удобочитаемых и почти удобочитаемых операторов, таких как :+
и +:
, но почему нет удобочитаемых синонимов, таких как append
?
Почему в коллекциях scala нет удобочитаемых методов, таких как .append, .push и т. д.
Ответы (5)
Все коллекции mutable в Scala имеют BufferLike и определяет метод append.
Неизменяемые коллекции не имеют трейта BufferLike и, следовательно, определяют только другие методы, которые не изменяют существующую коллекцию, а создают новую.
append
. Почему бы не добавить такие псевдонимы, хотя бы для облегчения взаимодействия с Java.
- person F0RR; 24.08.2011
Имена символических методов допускают комбинацию с операцией присваивания =
.
Например, если у вас есть метод ++
, создающий новую коллекцию, вы можете автоматически использовать ++=
для присвоения новой коллекции какой-либо переменной:
var array = Array(1,2,3)
array ++= Array(4,5,6)
// array is now Array(1,2,3,4,5,6)
Это невозможно без символических имен методов.
На самом деле они часто являются удобочитаемыми синонимами:
foldLeft
эквивалентно/:
foldRight
эквивалентно:\
Остальные являются операторами сложения, которые вполне удобочитаемы для человека:
++
эквивалентен JavaaddAll
:+
добавляется+:
добавляется
Положение точки с запятой указывает экземпляр получателя.
Наконец, некоторые странные операторы являются наследием других языков функционального программирования. Например, построение списка (SML) или обмен сообщениями между актерами (erlang).
:+
и append
это одно и то же. Я думаю, что первый (из SeqLike
) создает новую коллекцию, а второй (из BufferLike
) изменяет буфер на месте.
- person Kipton Barros; 25.08.2011
Отличается ли он от любого другого языка?
Возьмем Яву. Какая удобочитаемая версия +
, -
, *
и /
на int
? Или возьмем String
: какая удобочитаемая версия +
? Обратите внимание, что concat
— это не одно и то же — он не принимает параметры, отличные от String
.
Возможно, вас это беспокоит, потому что в Java — в отличие, скажем, от C++ — используются либо исключительно неалфавитные операторы, либо алфавитные операторы — за исключением String
в +
.
Стандартная библиотека Scala не предназначена для поддержки Java. Вместо этого предоставляются адаптеры для преобразования между коллекциями Java и Scala.
Попытка предоставить дружественный к Java API не только ограничила бы выбор идентификаторов (или обязала бы предоставлять псевдонимы), но также ограничила бы способ использования универсальных типов и типов функций. Для проверки конструкции потребуется значительно больше испытаний.
По той же теме я помню некоторые споры о том, должны ли коллекции 2.8 реализовывать java.util.Iterable
.
http://www.scala-lang.org/node/2177