在 Odersky 等人的 Scala 书中,他们说使用列表。我还没有从头到尾读过这本书,但所有的例子似乎都使用了 val List。据我了解,还鼓励人们使用 vals 而不是 vars。但在大多数应用程序中,使用 var List 或 val MutableList 之间是否没有权衡?显然,我们会尽可能使用 val 列表。但是使用大量 var 列表(或 var 向量等)是一个好的做法吗?
我是从 C# 开始接触 Scala 的。在那里我有很多:
public List<T> myList {get; private set;}
如果 C# 内置了不变性,那么可以很容易地将集合声明为 val,因为集合本身在构造后永远不会改变,即使在其生命周期内会从集合中添加和删除元素。因此声明一个 var 集合几乎感觉就像远离了不变性一步。
根据回答和评论,Scala 的一大卖点是:它可以带来很多好处,而不必像 Lisp 或 Haskell 那样完全改变人们编写代码的方式。
使用大量 var 列表(或 var 向量)是一个好习惯吗?
ETC)?
我想说这是更好的做法var
与不可变集合相比,使用val
与可变的。从我的头顶上掉下来,因为
-
您对行为有更多保证:如果您的对象有一个可变列表,您永远不知道其他外部对象是否会更新它
-
您限制可变性的程度;返回集合的方法将产生一个不可变的集合,因此您只在一个对象内具有可变性
-
通过简单地将 var 分配给 val 来使 var 不可变很容易,而要使可变集合不可变,您必须使用不同的集合类型并重建它
在某些情况下,例如具有大量 I/O 的时间相关应用程序,最简单的解决方案是使用可变状态。并且在some https://stackoverflow.com/a/10015801/770361在这种情况下,可变的解决方案更加优雅。然而,在大多数代码中,您根本不需要可变性。关键是使用具有高阶函数的集合,而不是循环或递归(如果不存在合适的函数)。这比听起来简单。您只需要花一些时间来了解 List 上的方法(以及其他集合,它们大多是相同的)。最重要的是:
map
:将您提供的函数应用于集合中的每个元素 - 使用而不是循环和更新数组中的值
foldLeft
:从集合返回单个结果 - 使用而不是循环和更新累加器变量
for-yield
表达式:简化映射和过滤,特别是对于嵌套循环类型问题
最终,大部分函数式编程都是不变性的结果,两者缺一不可。然而,局部变量主要是一个实现细节:只要它不能逃离局部范围,一点可变性就没有问题。因此,请将变量与不可变集合一起使用,因为本地变量不会被导出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)