В С++. Я могу объявить большинство вещей как const, например:
Переменные: const int i=5;
Scala имеет val i=5
, однако это будет только предотвращать переназначение, а не изменять объект, как показывает следующий пример:
С++:
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)
Это еще хуже с функциями-членами:
С++:
class Foo {
int i;
int iPlusFive() const {return i+5;}
int incrementI(){ return ++i; }
}
I can be sure, that calling iPlusFive won't change the object and that I won't accidentally call incrementI on a const object.
Когда дело доходит до коллекций, С++ продолжает его const-correct streak с коллекциями const: просто объявляйте свой вектор как const, и вы не можете его изменить. Назначьте non-const vector<Int>
a const vector<Int>
, и компилятор ничего не скопирует и не позволит вам что-либо изменить в коллекции now const.
Scala имеет scala.collection.mutable.whatever и scala.collection.immutable.whatever, вы не можете просто конвертировать измененные коллекции в неизменяемые коллекции, кроме того, вам по-прежнему разрешено изменять собранные объекты с их неконстантными функциями-членами.
Почему scala, который имеет действительно отличную систему типов, не имеет ничего сопоставимого с ключевым словом С++?
Изменить:
Маргус предложил использовать import scala.collection.mutable
.
Моим решением было использовать
import scala.collection.mutable.HashMap
import scala.collection.immutable.{HashMap => ConstHashMap}
Это сделает изменчивый HashMap доступным как HashMap и неизменяемым als ConstHashMap, однако мне все же нравится подход на С++.