【问题标题】:When is it okay to use "var" in Scala?什么时候可以在 Scala 中使用“var”?
【发布时间】:2012-10-27 04:39:25
【问题描述】:

我知道 Scala 有 var(用于可变状态),但纯函数式编程不鼓励使用任何可变状态,而是专注于将 val 用于所有内容。

来自命令式世界,很难放弃可变状态。

我的问题是什么时候可以在 Scala 代码中使用 var ?真的可以只使用 val 来完成所有代码吗?如果是,那么为什么 Scala 有变量?

【问题讨论】:

  • 我想你的意思是问“那么为什么 Scala 有 vars”。
  • @pst - 你是对的,Scala 并不纯粹。我想这是它有 vars 的原因之一。但是,我原来的问题仍然存在。

标签: scala functional-programming var mutable


【解决方案1】:

以下是 Scala 中使用 var 的一些原因:

  • Scala 是一种多范式语言,它鼓励函数式编程,但将选择权留给了程序员。
  • 兼容性:许多 Java API 都公开了可变变量。
  • 性能:有时使用 var 可以获得最佳性能。
  • 当人们说一切都可以在没有 var 的情况下完成时,这是正确的,因为 Scala 仍然可以在没有 var 的情况下完成图灵。但是,它不会改变前面几点的有效性。

【讨论】:

  • 感谢您的精彩回答。但是您能否为Scala would still be turing complete without vars.提供一些参考
  • 我刚刚遇到了一个 var 有意义的实例:我必须编写一个通用函数,将一些整数加到一个位掩码中。我创建了一个创建 var 累加器的函数,然后在某些条件下向该 var 添加值,然后返回最终结果。 var 不暴露给任何其他代码,封装在单个函数中。这可以重写为使用 val,但是,对于需要添加到原始 var 的每种情况,您必须创建一个新的 val 以将其添加到 return 语句中。为了不变性,在此处使用 val 会增加内存开销使用...
【解决方案2】:

即使从函数式编程的角度来看,您也可以在本地使用 var(或可变对象),前提是它们不离开定义它们的范围。

例如,考虑这个(人为的)函数,它返回列表的大小:

def dumbSize( lst: List[Int] ): Int = {
   var i = 0
   var rest = lst
   while( rest != Nil ) {
     i += 1
     rest = rest.tail
   }
   i
}

虽然这个(丑陋的)函数使用了 var,但它仍然是纯粹的(没有副作用,并且对于给定的参数值,它总是返回相同的结果)。

“可变状态封装”的另一个示例是参与者模型,其中参与者状态通常是可变的。

【讨论】:

  • 我想你的意思是rest.tail
  • 并将最后一个 rest 替换为 i
  • 另外,您应该将rest.size > 0 替换为rest != Nil 以不具有二次性能
  • 或者这只是为了证明命令式编程的易错性? ;)
  • @KimStebel 我真的对我设法在这个小函数中填充的错误数量感到惊讶!感谢您的修复。
猜你喜欢
  • 1970-01-01
  • 2011-02-24
  • 2011-09-12
  • 2012-12-16
  • 2013-03-24
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多