【问题标题】:Incrementing and getting value增加和获得价值
【发布时间】:2013-01-25 16:38:18
【问题描述】:

简单的 scala 问题。请考虑以下内容。

scala> var mycounter: Int = 0;
mycounter: Int = 0

scala> mycounter += 1

scala> mycounter
res1: Int = 1

在第二个语句中,我增加了我的计数器。但是什么都没有返回。如何在一个语句中递增和返回某些内容。

【问题讨论】:

  • 你没有。作为一般规则,副作用方法或表达式不会返回有趣的值,只会返回Unit
  • @Randall Schulz 关于副作用的好观点。

标签: scala


【解决方案1】:

使用'+='return Unit,所以你应该这样做:

{ mycounter += 1; mycounter }

你也可以使用闭包来解决这个问题(因为函数参数是 val):

scala> var x = 1
x: Int = 1

scala> def f(y: Int) = { x += y; x}
f: (y: Int)Int

scala> f(1)
res5: Int = 2

scala> f(5)
res6: Int = 7

scala> x
res7: Int = 7

顺便说一句,您可以考虑改用不可变值,并采用这种编程风格,那么您的所有语句都会返回一些东西;)

【讨论】:

  • 好帖子。但就我而言,我使用的是计数器,这意味着我无法使其完全不可变。
  • 我很确定你可以,你介意与完整的用例分享一个馅饼吗?
  • 哦,好吧,演员中的变异状态(看到你对其他帖子的评论),那么绝对有意义。
  • 这些年来 Scala 有什么变化吗?我能够做这篇文章撰写时 OP 无法做的事情。编辑:我正在运行“Scala 版本 2.11.7(Java HotSpot(TM) 64 位服务器 VM,Java 1.8.0_45)”
【解决方案2】:

Assignment 是一个计算为 Unit 的表达式。背后的推理可以在这里找到:What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?

在 Scala 中,这通常不是问题,因为您要解决的问题可能有不同的构造。

我不知道您的确切用例,但如果您想使用增量,它可能采用以下形式:

(1 to 10).foreach { i => 
  // do something with i
}

【讨论】:

  • 我的确切情况是我有一个封装了计数器的 Actor。每次发送消息时,它的价值都会增加。
  • 我明白了,这是var 的好地方。在这种情况下,您可以按照 Alois Cochard 的建议创建一个方法:def increment:Int = { counter += 1; counter }
【解决方案3】:

有时我会这样做:

val nextId = { var i = 0; () => { i += 1; i} }
println(nextId())                               //> 1
println(nextId())                               //> 2

如果您需要一些时间来访问值而不递增,则可能不适合您。

【讨论】:

    猜你喜欢
    • 2020-09-07
    • 2012-03-20
    • 2013-02-19
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多