增加和获得价值
Posted
技术标签:
【中文标题】增加和获得价值【英文标题】: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 关于副作用的好观点。
【参考方案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
如果您需要一些时间来访问值而不递增,则可能不适合您。
【讨论】:
以上是关于增加和获得价值的主要内容,如果未能解决你的问题,请参考以下文章