Если я вызываю toSeq
в неизменяемой коллекции Set
, я получаю ArrayBuffer
.
scala> Set(1,2,3).toSeq // returns Seq[Int] = ArrayBuffer(1, 2, 3)
Это меня удивляет. Учитывая Scala акцент на использовании неизменяемых структур данных, я ожидаю вернуть неизменяемую последовательность, такую как Vector
или List
вместо изменчивого ArrayBuffer
. Возвращаемое упорядочение элементов набора должно быть, конечно, undefined, но, похоже, не существует какой-либо семантической причины, почему это упорядочение также должно быть изменчивым.
В общем, я ожидаю, что операции Scala всегда будут давать неизменные результаты, если я явно не запрошу mutable. Это было мое предположение, но оно неверно здесь, и я просто потратил час на отладку проблемы, когда неожиданное присутствие ArrayBuffer
привело к ошибке выполнения в инструкции match
. Мое исправление заключалось в том, чтобы изменить Set(...).toSeq
на Set(...).toList
, но это похоже на взломать, потому что ничего не нужно в моем приложении, которое требует, в частности, списка в этой точке.
Имеет ли Set(...).toSeq
возвращаемый изменчивый объект дефект в реализации Scala или существует принцип, который я неправильно понимаю здесь?
Это Scala 2.9.2.