2009-12-10 3 views
1

스칼라 익명 함수를 정의 할 때 블록을 사용할 수 있습니까?

나는이 방법을 가지고있다 :

def myMethod(value:File,x: (a:File) => Unit) = { 
    // Some processing here 
    // More processing 
    x(value) 
} 

나는 이것을 다음과 같이 부를 수 있음을 안다.

myMethod(new File("c:/"),(x:File) => println(x)) 

중괄호를 사용하여 호출 할 수있는 방법이 있는가? 뭔가 :

myMethod(new File("c:/"),{ (x:File) => 
    if(x.toString.endsWith(".txt")) { 
     println x 
    } 
}) 

아니면 다른 방법으로 쓰고 myMethod 전달해야합니까?

답변

7

함수의 신체 일부가 블록은 괄호로 묶을 수 있습니다 :

def myMethod(value: File)(x: File => Unit) = x(value) 

지금 당신이 같은 코드를 작성할 수 있습니다 :

myMethod(new File("c:/"), x => { 
    if (x.toString.endsWith(".txt")) { 
    println(x) 
    } 
}) 

대안은 카레 함수로 MyMethod라는를 정의하는 방법입니다 다음 :

myMethod(new File("c:/")) { x => 
    if (x.toString.endsWith(".txt")) { 
    println(x) 
    } 
} 
+0

첫 번째 코드 단편을 실행할 때 다음과 같은 오류가 나타납니다. "(w.scala 조각) : 23 : 오류 : 값 x가"at line "의 단위가 아닙니다. – Geo

+0

"println x "가 println이어야합니다 (x) – faran

+0

고마워! 이 작품! 'x'의 타입을 어떻게 지정할 수 있습니까? – Geo

2

당신이 실제로 준 작품은, 약 x 주위에 println x에 nthesis. 그냥 괄호를 넣으면 코드가 작동합니다.

이제 괄호가 필요할 때와 그렇지 않을 때가 궁금 할 것입니다. 다행스럽게도 다른 사람이 that very question에게 질문했습니다.