2013-01-24 2 views
6

스칼라를 배우기 시작했는데 스칼라에서 프로그래밍 스칼라 교과서의 스 니펫을 보았습니다. 어떤 사람이 나를 도울 수 있기를 바랬습니까?스칼라 이해하기 : 인자를 함수로 전달하기

이것은 Programming in Scala, 2nd Edition의 Listing 9.1에서 온 것입니다.

object FileMatcher { 
    private def filesHere = (new java.io.File(".")).listFiles 
} 

private def filesMatching(matcher: String => Boolean) = 
    for (file <- filesHere; if matcher(file.getName)) yield file 

def filesEnding(query: String) = 
    filesMatching(_.endsWith(query)) // ??? 

def filesContaining(query: String) = 
    filesMatching(_.contains(query)) // ??? 

def filesRegex(query: String) = 
    filesMatching(_.matches(query)) // ??? 

나는 약간의 줄이 // ???과 혼동 스럽다. _을 사용하면 어떤 식 으로든 filesMatching에 전달되는 익명의 함수가 생성됩니까? 또는 _은이 작업과 관련이 없으며 컴파일러는 filesMatching에 함수가 필요하므로 표현식으로 _.endsWith(query)을 실행하지 않고 대신 표현식을 함수로 만듭니다.

+1

위의 '// ???'가있는 행이 없습니다. 그것들을 잊어 버린 것일까 요? –

+0

죄송합니다. 지금 '//???'을 추가했습니다. – C0deAttack

+0

[Scala \ _ 자리 표시 자 (이 코드는 어떻게 작동합니까?)] 가능한 복제본] (http://stackoverflow.com/questions/6880407/scala-placeholders-how-does-this-code-function) –

답변

14

확장 정의

익명 함수가 정의 들이 더 상세하고 완전한 형태로

(a: A, b: B, ...) => function body //using a, b, ... 

[예 :

(a: String, b: String) => a ++ b // concatenates 2 Strings 

추론 유형

, 당신은 매개 변수 '유형을 생략 할 수 있습니다 (높은 순서 기능은 함수 인수에 대한 특정 서명이 기대하는 경우와 같이) 문맥이 필요한 정보를 제공하는 경우, 예 :

(a, b, ...) => function body //using a, b, ... 

예 당신의 매개 변수 함수 본문에 의해 당신이 그들을 선언 할 것을 한 번 각각 같은 순서로 사용하는 경우


val l = List(1, 2, 3) 

//you can omit the type because filter on List[Int] expects a (Int => Boolean) 
l.filter(i => i < 3) 
이 자리 구문 마지막으로

당신은 여전히 ​​짧은 양식을 사용할 수 있습니다

_ ++ _ // which is equivalent to (a, b) => a ++ b 

_는 함수의 인수

을위한 자리 표시 자입니다3210

예.

filesMatching의 인수는 유형 String => Boolean의 기능은 그래서 당신은

_.endsWith(query) // equivalent to (s: String) => s.endsWith(query) 
_.contains(query) // equivalent to (s: String) => s.contains(query) 
_.matches(query) // equivalent to (s: String) => s.matches(query) 
3

여기서 사용 된 _은 함수 인수의 약자입니다. 따라서 filesMatching(_.endsWith(query))filesMatching(f => f.endsWith(query))과 같습니다. filesMatching은 인수로 String => Boolean의 함수를 가지므로 컴파일러는 fString이 될 것으로 예상합니다. 그래서 당신은이 표현이 익명의 함수라는 것입니다.

0

최고의 기능 유형을 정의하여 수행되는 작업의이 종류를 사용할 수 있습니다. 나는 훌륭한 데모 here을 발견했다.이 게시물과 함께, 데모는 함수를 인수로 전달하는 모범 사례를 분명히해야합니다.

관련 문제