В 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 ++.