2013-02-10 124 views
4

简单的斯卡拉问题。考虑下面。递增和获得价值

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

scala> mycounter += 1 

scala> mycounter 
res1: Int = 1 

在第二个声明中,我增加了我的计数器。但没有任何回报。如何在一个语句中增加和返回一些内容。

+2

你不知道。作为一般规则,副作用方法或表达式不会返回有趣的值,而仅返回“单位”。 – 2013-02-10 15:37:56

+0

@Randall Schulz关于副作用的好处。 – dublintech 2013-02-10 17:11:11

回答

8

使用 '+ =' 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,你可能会考虑使用不可变的值,并且接受这种编程风格,那么所有的语句都会返回一些内容;)

+0

好帖子。但在我的情况下,我正在使用计数器,这意味着我无法使其完全不可变。 – dublintech 2013-02-10 12:37:53

+0

我很肯定你可以,你会介意与完整的使用案例分享一个馅饼吗? – 2013-02-10 12:39:06

+0

哦,好吧,演员中的变异状态(看到你对其他帖子发表评论),那么肯定是有道理的。 – 2013-02-10 12:39:58

1

赋值是一个被评估的表达式到单位。其背后的推理可以在这里找到:What is the motivation for Scala assignment evaluating to Unit rather than the value assigned?

在斯卡拉这通常不是一个问题,因为可能有一个不同的构造,你正在解决的问题。

我不知道你的确切的使用情况,但如果你想使用的增量可能是下面的形式:

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

我确切的情况是我有一个演员封装计数器。每次发送消息时,它都会增加价值。 – dublintech 2013-02-10 12:38:38

+0

我明白了,那是'var'的好地方。在这种情况下,你可以像Alois Cochard建议的那样创建一个方法:'def increment:Int = {counter + = 1;反}} – EECOLOR 2013-02-10 12:49:42

7

有时候,我这样做:

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

魔法门如果您需要某个时间访问值而不是递增,则不适用于您。