2013-02-10 94 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 

魔法門如果您需要某個時間訪問值而不是遞增,則不適用於您。