2013-02-10 2 views
4

간단한 스칼라 질문입니다. 아래를 고려하십시오.증분 값 받기

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

scala> mycounter += 1 

scala> mycounter 
res1: Int = 1 

두 번째 문장에서 나는 카운터를 증가시킵니다. 하지만 아무것도 반환되지 않습니다. 한 문에서 무엇을 증분하고 반환합니까?

+2

그렇지 않습니다. 부작용 메서드 또는 표현식은 일반적으로 흥미로운 값을 반환하지 않으며 'Unit'만 반환합니다. –

+0

@ 란달 슐츠 부작용에 대한 좋은 지적. – dublintech

답변

8

사용 '+ ='return Unit, 당신이해야하므로 (함수의 매개 변수가 발이기 때문에)

{ mycounter += 1; mycounter } 

당신은 너무 폐쇄를 사용하여 트릭을 수행 할 수 있습니다

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

+0

전 당신이 할 수있을 거라 확신합니다. 유스 케이스 전체를 공유 할 수 있을까요? –

+0

오, 좋아, 배우에서 상태를 돌연변이 (다른 게시물에 대한 의견을 보았습니다), 그럼 확실히 이해가 되네. –

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

+0

내가보기에 그것은'var'을위한 좋은 장소입니다. 이 경우 Alois Cochard가 다음과 같이 제안했다. def increment : Int = {counter + = 1; 카운터}' – EECOLOR

7

내가 할이 :

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

마이트 값에 액세스하기 위해 언젠가이 증가하지 않으면 사용자에게 도움이되지 않습니다.