简单的斯卡拉问题。考虑下面。递增和获得价值
scala> var mycounter: Int = 0;
mycounter: Int = 0
scala> mycounter += 1
scala> mycounter
res1: Int = 1
在第二个声明中,我增加了我的计数器。但没有任何回报。如何在一个语句中增加和返回一些内容。
简单的斯卡拉问题。考虑下面。递增和获得价值
scala> var mycounter: Int = 0;
mycounter: Int = 0
scala> mycounter += 1
scala> mycounter
res1: Int = 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
BTW,你可能会考虑使用不可变的值,并且接受这种编程风格,那么所有的语句都会返回一些内容;)
好帖子。但在我的情况下,我正在使用计数器,这意味着我无法使其完全不可变。 – dublintech 2013-02-10 12:37:53
我很肯定你可以,你会介意与完整的使用案例分享一个馅饼吗? – 2013-02-10 12:39:06
哦,好吧,演员中的变异状态(看到你对其他帖子发表评论),那么肯定是有道理的。 – 2013-02-10 12:39:58
赋值是一个被评估的表达式到单位。其背后的推理可以在这里找到:What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?
在斯卡拉这通常不是一个问题,因为可能有一个不同的构造,你正在解决的问题。
我不知道你的确切的使用情况,但如果你想使用的增量可能是下面的形式:
(1 to 10).foreach { i =>
// do something with i
}
我确切的情况是我有一个演员封装计数器。每次发送消息时,它都会增加价值。 – dublintech 2013-02-10 12:38:38
我明白了,那是'var'的好地方。在这种情况下,你可以像Alois Cochard建议的那样创建一个方法:'def increment:Int = {counter + = 1;反}} – EECOLOR 2013-02-10 12:49:42
有时候,我这样做:
val nextId = { var i = 0;() => { i += 1; i} }
println(nextId()) //> 1
println(nextId()) //> 2
魔法门如果您需要某个时间访问值而不是递增,则不适用于您。
你不知道。作为一般规则,副作用方法或表达式不会返回有趣的值,而仅返回“单位”。 – 2013-02-10 15:37:56
@Randall Schulz关于副作用的好处。 – dublintech 2013-02-10 17:11:11