2012-09-12 5 views
1

현재 스칼라를 배우고 있습니다. 나는 참을성이없는 스칼라를 읽고있다.스칼라에 관한 질문

1)

가드

차이가를?

for (i <- 0 to 10)if (i % 2 == 0) println(i) 

for (i <- 0 to 10 if i % 2 == 0) println(i) 

2)

난 항상 다음과 같은 기호 =>를 볼 수 있지만, 그것이 무엇을 설명하지 않았다.

때로는 캐스트라고 생각하지만 완전히 다른 것이라고 생각합니다. 문제를 해결할 수 있기를 바랍니다.

답변

5

1) 예) 차이가 있습니다. 처음에는 정상적으로 if 문을 닫음 부호로 전달합니다. 두 번째는 실제 가드입니다. foreach을 호출하기 전에 실제로 범위에서 withFilter을 호출합니다. 그래서 두 가지의 번역은 다음과 같이 표시됩니다

0.to(10).foreach(i => if(i % 2 == 0) println(i)) 
0.to(10).withFilter(x => x % 2 == 0).foreach(i => println(i)) 

withFilter 또는 전화 단지 filter 대신 문이 몇 가지 이점이있는 경우 정상를 사용하여, 좀 더 컨텍스트를 추가하려면. 이해를 돕기 위해 맵핑, 플랫 맵, 필터, 수집 등의 중첩 호출을 할 수 있습니다. 가드를 추가하면 실제 발생하는 많은 af 호출을 방지 할 수 있습니다. 예를 들어 : 결과는 동일하게 유지하면서

for { 
    x <- 0 until 10 
    y <- 10 until 20 
} { 
    if(x % 2 == 0) println(x*y) 
} 

는 실제 폐쇄 100 회

for { 
    x <- 0 until 10 
    if x % 2 == 0 
    y <- 10 until 20 
} println(x*y) 

이 50 번이나 호출을 부를 것이다.

2)

=> 몸에서 함수/폐쇄 인수 목록을 분리한다.

case e: NumberFormatException => None은 부분 기능의 일부입니다. 여기서 =>은 "인수"e과 본문 None을 구분합니다. 이 i이 유형 Function1[A,Int]이다 것을 의미한다 someFunction(i: (A) => Int)에서 같은 유형의 서명에

는 " A에서 Int에 기능"을 참조하십시오.

+0

감사합니다. 하지만 두 번째 부분을 조금 더 설명 할 수 있습니까? 몇 가지 예제는'def someFunction (i : (A) => Int)'또는'case e : NumberFormatException => None' 둘 다 완전히 다른 것 같습니다. –

+0

@MaikKlein IMHO, 당신이 언급 한 두 가지 경우는 완전히 다릅니다. drexin의 설명은 꽤 좋다. 이제, 스칼라의 많은 기호가 * 많은 * 다른 의미를 가지지 않도록하십시오. 개요를 보려면 [이 답변] (http://stackoverflow.com/a/7890032/53013)을 참조하십시오. 슬프게도,'=>'은 거기에서 잘 다루어지지 않았습니다. –