2010-06-02 7 views
4

내가이 같은 일부 스칼라 코드 말해봐 :왜 yield 식의 메서드를 호출 할 수 없습니까?

// Outputs 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 
println(squares) 

def squares = { 
    val s = for (count <- 1 to 10) 
       yield { count * count } 
    s.mkString(", "); 
} 

을 왜 임시 발 s을 (를) 사용해야합니까? 나는이 시도 :

error: value mkString is not a member of Int 
    def squares = for (count <- 1 to 10) yield { count * count }.mkString(", ") 

하지 mkStringfor 루프에 의해 반환 된 컬렉션 호출해야 :이 오류 메시지와 함께 컴파일에 실패

def squares = for (count <- 1 to 10) 
        yield { count * count }.mkString(", ") 

?를

답변

18

괄호가 누락되었습니다. for -expression의 결과에 대해 mkString 메서드를 호출하려고합니다. 여분의 괄호가 없으면 컴파일러는 메서드를 인 에 호출하려고한다고 생각합니다. 어쨌든

scala> def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ") 
squares: String 

scala> squares 
res2: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 

내가 대신 map 방법을 사용해야하는 것이 좋습니다 :

scala> 1 to 10 map { x => x*x } mkString(", ") 
res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 
+2

그의 당신이 제공 한 동일한지도 방법 단지 문법 설탕입니다. 당신이 사용하고자하는 것은 제 의견으로는 단지 맛의 문제 일뿐입니다. –

5

그냥 루프의 괄호를 넣어 그것을 작동 :

scala> (for (count <- 1 to 10) yield { count * count }).mkString(", ") 

res0: String = 1, 4, 9, 16, 25, 36, 49, 64, 81, 100

3

때 초에 가지고 계신대로 mkString으로 전화하십시오. 예를 들어 콜렉션에서는 호출되지 않고 반환되는 개별 정수에 따라서 호출됩니다. 따라서 오류 메시지는 mkString is not a member of Int입니다. 당신이 for..yield 표현 자체에 메소드를 호출 할 경우
, 당신은 그것을 괄호로해야합니다 :

이해에 대한
def squares = (for (count <- 1 to 10) yield { count * count }).mkString(", ") 
관련 문제