加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

为什么scala不具有C-like常量语义?

发布时间:2020-12-16 09:36:51 所属栏目:安全 来源:网络整理
导读:在C。我可以将大多数事情声明为const,例如: 变量:const int i = 5; Scala的值为i = 5,但这只会阻止重新分配,而不会改变对象,如下例所示: C : const int i[]={1,2,3,4};i[2]=5; //error 斯卡拉: val a=Array(1,4)a(2)=5 //a is now Array(1,5,4) 会
在C。我可以将大多数事情声明为const,例如:
变量:const int i = 5;
Scala的值为i = 5,但这只会阻止重新分配,而不会改变对象,如下例所示:
C :

const int i[]={1,2,3,4};
i[2]=5; //error

斯卡拉:

val a=Array(1,4)
a(2)=5 //a is now Array(1,5,4)

会员功能变得更糟:
C :

class Foo {
int i;
int iPlusFive() const {return i+5;}
int incrementI(){ return ++i; }
}

我可以确定,调用iPlusFive不会更改对象,并且我不会不小心在const对象上调用incrementI。

当涉及到集合时,C继续它与const集合的常量正确连接:简单地将你的向量声明为const,你不能改变它。分配非常量向量< Int>到一个常量向量< Int>并且编译器将不会复制任何东西,并且将阻止您改变现在的const集合中的任何内容。

Scala具有scala.collection.mutable.whatever和scala.collection.immutable.whatever,你不能只是将可变集合转换为不可变集合,此外,您仍然可以使用其非常量成员函数更改收集的对象。

为什么scala有一个非常好的类型系统,没有什么可比C const关键字?

编辑:
Margus建议使用import scala.collection.mutable。
我的解决方案是使用

import scala.collection.mutable.HashMap
import scala.collection.immutable.{HashMap => ConstHashMap}

这将使可变的HashMap可用作HashMap和不可变的als ConstHashMap,但是我仍然更喜欢C方法。

解决方法

我不喜欢C const逻辑的是它是关于引用,而不是关于被引用的对象。如果我有一个“const T *”,则不能保证持有非const指针的人不会修改对象的状态。因此,它无法以任何方式避免多线程系统中的竞争条件,也不能有助于实现持久性容器。

在我看来,在一个标准的图书馆里有一个不可变类的概念和不可变的容器是非常有帮助的,是任何语言的错误。因为这些应该显示出可观察到的不变性,但是由于效率原因,我可能需要能够改变内部/不可见的状态,我认为const语法将没有什么帮助。

Scala有一个不可改变的类,我们需要直接使用或者使用其他不可变类。这是非常有价值的。额外的语法可能是一个很好的补充,但我可以没有它生活。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读