Почему в scala нет C ++ - подобной константной семантике?

В C ++. Я могу объявить большинство вещей как const, например:
Переменные: const int i = 5;
Scala имеет val i = 5 , однако это предотвратит только переназначение, а не изменение объекта, как показано в следующем примере:
C ++:

const int i[]={1,2,3,4};
i[2]=5; //error
Scala:
val a=Array(1,2,3,4)
a(2)=5 //a is now Array(1, 2, 5, 4)

Еще хуже с функциями-членами:
C ++:

class Foo {
int i;
int iPlusFive() const {return i+5;}
int incrementI(){ return ++i; }
}
Я могу быть уверен, что вызов iPlusFive не изменит объект и что я не буду случайно вызывать incrementI для константного объекта.

Когда дело доходит до коллекций, C ++ продолжает серию константно-корректных коллекций: просто объявите свой вектор как константный, и вы не сможете его изменить. Назначьте неконстантный вектор константному вектору , и компилятор ничего не будет копировать и не позволит вам изменить что-либо в коллекции now const.

Scala имеет scala.collection.mutable.whatever и scala.collection.immutable.whatever, вы не можете просто преобразовать изменяемые коллекции в неизменяемые коллекции, кроме того, вам по-прежнему разрешено изменять собранные объекты с помощью их неконстантных функций-членов. .

Почему в scala, в котором есть отличная система типов, нет ничего, что можно было бы сравнить с ключевым словом const в C ++?

Изменить: Маргус предложил использовать import scala.collection.mutable . Мое решение заключалось в использовании

import scala.collection.mutable.HashMap
import scala.collection.immutable.{HashMap => ConstHashMap}
. Это сделает изменяемую HashMap доступной как HashMap и неизменяемую, как ConstHashMap, однако мне по-прежнему больше нравится подход C ++.
20
задан tstenner 5 October 2010 в 14:24
поделиться