2010-04-01 7 views
2

(참고 : 2.8이 아닌 Scala 2.7.7을 사용하고 있습니다.)왜이 문장 중 하나는 스칼라에서는 컴파일되지만 다른 하나는 컴파일되지 않습니까?

간단한 2 열 CSV 파일의 값을 기반으로지도를 만드는 방법이 매우 간단합니다. 충분히 쉽게 완료했지만, 처음 시도한 이유에 대해 당황 스럽습니다. 컴파일하지 않았다.

// Returns Iterator[String] 
private def getLines = Source.fromFile(csvFilePath).getLines 

// This doesn't compile: 
def mapping: Map[String,String] = { 
    Map(getLines map { line: String => 
      val pairArr = line.split(",") 
      pairArr(0) -> pairArr(1).trim() 
     }.toList:_*) 
    } 

// This DOES compile 
def mapping: Map[String,String] = { 
    def strPair(line: String): (String,String) = { 
     val pairArr = line.split(",") 
     pairArr(0) -> pairArr(1).trim() 
    } 
    Map(getLines.map(strPair(_)).toList:_*) 
    } 

컴파일러 오류가

CsvReader.scala:16: error: value toList is not a member of (St ring) => (java.lang.String, java.lang.String) [scalac] possible cause: maybe a semicolon is missing before `value toList'? [scalac]
}.toList:_*) [scalac] ^
[scalac] one error found

그래서이 제공

입니다 : 여기에 코드는? 그것들은 명시 적 함수 정의 (nonworking 예제에서는 익명)와()와 {}를 제외하고 나처럼 동등해야합니다. nonworking 예제에서 중괄호를 괄호로 바꾸면 오류가 " '; 예상했지만 '발'이 발견되었습니다. " 그러나 지역 변수 정의를 제거하고 문자열을 두 번 분할하고 중괄호 대신 괄호를 사용하면 컴파일됩니다. 누군가가 나에게이 차이점을 설명 할 수 있습니까? 스칼라 문서에 대한 링크를 사용하면 메서드 인수를 둘러싸는 데 사용할 때 괄호와 중괄호의 차이점을 설명 할 수 있습니까?

답변

4

차이점은 첫 번째 예에서 연산자 표기법을 사용하고 있기 때문입니다.

def mapping: Map[String,String] = { 
    Map((getLines map { line: String => 
     val pairArr = line.split(",") 
     pairArr(0) -> pairArr(1).trim() 
    }).toList:_*) 
} 

을하거나 운영자 구문을 사용하지 않는 경우는

def mapping: Map[String,String] = { 
    Map(getLines.map({ line: String => 
     val pairArr = line.split(",") 
     pairArr(0) -> pairArr(1).trim() 
    }).toList:_*) 
} 

내가 문제가 정상 메소드 호출 구문을 사용하여 가지고 있다는 것입니다 생각 작동 : 괄호의 추가 세트를 추가하는 경우 그것은 작동 메소드 호출의 연산자 구문보다 우선 순위가 높습니다. 이는 .toListmap 메서드 호출의 결과가 아닌 익명 함수에 적용되고 있음을 의미합니다. 당신이 운영자 구문을 사용하지 않는 경우

2

는 그것을 잘 컴파일 :

//Compiles 
def mapping: Map[String,String] = { 
    Map(getLines.map { line: String => 
      val pairArr = line.split(",") 
      pairArr(0) -> pairArr(1).trim() 
     }.toList:_*) 
    } 

당신이 익명 함수를 사용하는 방법에 문제가 아니지만, 벤 언급 한 바와 같이, .하지 않고 통화 map의 구문 일반적인 Java 스타일의 메소드 호출과 동일하지 않습니다.

관련 문제