(I를 다른 (다시 모호하게) 질문을 게시 것을 보지 못했다. 여기에 내가 처음 일)에 응답 무엇보다
더 값/이름을 전달 =>
사용되는 대체 구문은 함수 리터럴을 정의하는 데 사용됩니다 함수를 정의한다.
예 시간. 다른 함수를 사용하는 함수가 있다고 가정 해 보겠습니다. 컬렉션은 전체로 구성되어 있지만 filter
을 선택하겠습니다. filter
은 (List와 같은) 콜렉션에서 사용될 때 사용자가 제공 한 함수가 false를 반환하도록하는 모든 요소를 제거합니다.
val people = List("Bill Nye", "Mister Rogers", "Mohandas Karamchand Gandhi", "Jesus", "Superman", "The newspaper guy")
// Let's only grab people who have short names (less than 10 characters)
val shortNamedPeople = people.filter(<a function>)
우리는 다른 곳 (def isShortName(name: String): Boolean
, 아마도)에서 실제 기능에 패스,하지만 바로 거기 배치 좋을 것입니다 수 있습니다. 아아, 우리는 함수 리터럴을 사용할 수 있습니다. 우리가 여기서 무슨 짓을
val shortNamedPeople = people.filter(name => name.length < 10)
은 (people
유형 List[String]
이기 때문에) 문자열에 걸리는 함수를 작성하고, 부울을 반환합니다. 멋지다, 맞지?
이 구문은 많은 문맥에서 사용됩니다. 이라고 말하면은 다른 기능을 사용하는 함수를 작성하려고합니다. 이 다른 함수는 String을 받아 들여 다른 String을 반환해야합니다.
def myFunction(f: String => Int): Int = {
val myString = "Hello!"
f(myString)
}
// And let's use it. First way:
def anotherFunction(a: String): Int = {
a.length
}
myFunction(anotherFunction)
// Second way:
myFunction((a: String) => a.length)
그게 리터럴 함수입니다. by-name
및 by-value
으로 돌아 가면 원하는 때까지 매개 변수를 평가하지 않도록 할 수있는 트릭이 있습니다. 고전적인 예 :
def logger(message: String) = {
if(loggingActivated) println(message)
}
이 괜찮아 보이지만, logger
가 호출 될 때 message
실제로 평가된다. message
을 평가하는 데 시간이 걸리면 어떻게 될까요? 예를 들어 logger(veryLongProcess())
입니다. 여기서 veryLongProcess()
은 문자열을 반환합니다. 와우? 그렇지 않아. veryLongProcess()
을 실제로 필요하기 전까지는 호출하지 않도록 함수 리터럴에 대한 지식을 사용할 수 있습니다.
def logger(message: => String) = {
if(loggingActivated) println(message)
}
logger(veryLongProcess()) // Fixed!
logger
해주기 매개 변수 (왼쪽 따라서 육안
=>
)를 필요하지 않는 기능
도입된다. 이전과 같이 사용할 수 있지만
message
은 사용시에만 평가됩니다 (
println
).
정확하게 내가 찾던 설명의 종류 :) 감사. 덧붙여서, 나는 coursera 과정을 수강하고 있으며 코드 스 니펫은 학습 자원 중 하나에 있습니다! – Raj
아하이 봐요. 나는 물론하고있다. 금요일에 만기가 된 행운을 기원합니다. BTW 과제에 대한 최신 정보를 유지할 계획 인 Google 캘린더를 만들었습니다. 원하는 경우 [email protected]이 Google 캘린더의 다른 캘린더에 해당 이메일을 추가합니다. –