2010-07-25 6 views
1

에 다리 할당을 수행내가이 작업을 수행 할 수 스칼라

var (a, b) = (0, 0) 
a = (b = 100) 

하지만 스칼라는

error: type mismatch; 
found : Unit 
required: Int 

는 내가 원하는 것은 같은 값으로 A와 B를 할당하는 것입니다 불평한다. 스칼라가 왜 Int가되어야하는 단위가 되는가?

답변

2

이유는 무엇입니까? 할당 표현식 유형은 Unit이며 그 이유는 다음과 같습니다. 연결된 과제가 없습니다. 기간.

+2

왜 왜 물어? 왜냐하면 나는 그것이 의미가 없다는 것을 알기 때문입니다. 자바는 그것을 가지고 있습니다, 루비는 그것을 가지고 있습니다, 스칼라가 왜 다른가? –

+2

스칼라는 그 언어가되고 싶지 않기 때문에. Scala에 break 문이없는 것과 같은 이유입니다. Java 및 Ruby에서 가져온 필수 수하물을 출입국 관리소에서 퇴장 시키도록 권장합니다. –

+1

Weeeelllll, 나는 그것을 제기하는 것을 싫어하지만, 스칼라는 요즘 (2.8 이후) break 문을 가지고있다. 하지만 가져 오기 (scala.util.control.Breaks._ import)해야합니다. 그래서 아무도 사용하지 않을 것입니다. 그리고 그것은 아마도 정확히 의도 된 것입니다 :-) –

5

명세서는 단위를 반환하는 과제입니다. 이유에 대해서는 this related question을 참조하십시오. 당신은 당신이 원하는 경우,이 작업을 수행 할 수 있습니다


scala> var (a,b) = (0,0) 
a: Int = 0 
b: Int = 0 

scala> a = {b = 100; b} 
a: Int = 100 
+0

링크를 제공해 주셔서 감사합니다. Martin은 Scala를 더 빠르게 만들고 싶다고 설명했습니다. 아마도 원래 링크에 댓글을 달고 싶습니다. –

2

당신은 당신의 자신의 유형 (그것을 잘 결합해야합니다으로는 콜론으로 끝나야합니다) 특별 할당 연산자를 정의하거나 일반적인 래퍼를 작성할 수 (포함 implit 전환). 실제로이를 사용하는 것이 좋습니다 않을 것이다, 그러나 여기 간다 :

case class M[T](var t:T) { 
    def =: (m: M[T]):M[T] = {m.t = t ; this} 
    } 

    implicit def anyToM[T](v:T) = M(v) 
    implicit def mToAny[T](m:M[T]) = m.t 

    def main(args: Array[String]) { 
    var a = M(0) 
    var b = M(0) 
    var c = M(0) 
    a =: b =: c =: 100 
    println(a + b + c) //--> 300 
    } 

나는 항상 몇 번의 키 입력을 저장하기 위해 무거운 마술 (magick)을 소환하는 나쁜 아이디어라고 생각합니다. 독일에서 우리는 ...

1
case class assign[T](v: T) {       
    def to(vals: (T => Unit)*) { vals.foreach{ vv => vv(v) } } 
} 

var (a,b) = (0,0) 

assign(39) to (a = _, b = _) 

assert(a == 39) 
assert(b == 39) 

을 "대포로 참새를 촬영"이 부를 것이다 또는 당신은 그것이 with 문의 비교적 간단한 버전을 에뮬레이트 이름을 바꿀 수 있습니다.

with(20) do (a = _, b = _, print) 
3
scala> var a,b,c,d,e,f,g = 0 
a: Int = 0 
b: Int = 0 
c: Int = 0 
d: Int = 0 
e: Int = 0 
f: Int = 0 
g: Int = 0 

scala> var f,i,j,k,m,n,o = new Object{} 
f: java.lang.Object = [email protected] 
i: java.lang.Object = [email protected] 
j: java.lang.Object = [email protected] 
k: java.lang.Object = [email protected] 
m: java.lang.Object = [email protected] 
n: java.lang.Object = [email protected] 
o: java.lang.Object = [email protected] 

scala> 
+0

좋은 트릭. 감사. –

관련 문제