5

簡単なscalaの質問。以下を考慮してください。

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

scala> mycounter += 1

scala> mycounter
res1: Int = 1

2番目のステートメントでは、カウンターをインクリメントします。しかし、何も返されません。1つのステートメントで何かをインクリメントして返すにはどうすればよいですか。

4

3 に答える 3

9

'+ ='を使用すると、 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

ところで、代わりに不変の値を使用することを検討し、このプログラミングスタイルを採用すると、すべてのステートメントが何かを返します;)

于 2013-02-10T12:18:11.607 に答える
7

時々私はこれをします:

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

インクリメントせずに値にアクセスする必要がある場合は、機能しない可能性があります。

于 2013-02-10T15:12:00.690 に答える
1

割り当ては、ユニットに評価される式です。その背後にある理由はここにあります:割り当てられた値ではなく、ユニットに評価されるScala割り当ての動機は何ですか?

Scalaでは、これは通常問題ではありません。これは、解決しようとしている問題に対して別の構成が存在する可能性があるためです。

正確な使用例はわかりませんが、インクリメントを使用する場合は、次の形式になる可能性があります。

(1 to 10).foreach { i => 
  // do something with i
}
于 2013-02-10T12:33:50.320 に答える