2012-09-21 4 views
0

가능한 중복 이해에 도움이 필요하십니까 :
Can anyone explain how the symbol “=>” is used in Scala는 스칼라 코드를

val list = List("abc", "cde", "fg") 
list.count (s => s.length == 3) 

위의 코드는 list 그 길이 문자열 요소의 수를 반환하는 것은 3 같다 . 그러나이 문맥에서 => 연산자의 사용법을 파악하는 데 어려움을 겪고 있기 때문에 스 니펫을 이해할 수 없습니다. 모든 설명이 도움이 될 것입니다. 당신이 카운트 기능을 사용할 때

def isValid(s:String) = s.length ==3 
list.count(isValid) 

그래서, 당신은 그것을 인수로 함수 인 조건을 제공 :

답변

2

그래, 스칼라는 이해하기가 어려울 수 있습니다. 나는 그것을 올바르게 이해하지 못할지라도 그것을 설명하기 위해 최선을 다할 것이다.

List.count 메서드는 매개 변수로 부울을 반환하는 코드 block을 사용합니다.

블록 코드의 단지 작은 니펫이 너무

def count (p : (A) => Boolean) : Int 

count으로 설명 스칼라 문서에서 { }

에 둘러싸 코드 예 여러 가지 방법으로 생성 될 수는 파라미터 p 걸린다 는 A 유형의 인수를 취하고 Boolean

을 반환하는 블록입니다. 따라서이 예에서 :

s => s.length == 3 

은 코드의 block입니다. 블록은 보통 그래서이 경우 s의 블록에 입력되고 s.length == 3 부울을 반환해야하는 코드입니다 형식을

[arguments] => [Code to execute] 

을 따르십시오. 올바른 순서로되어있는 한 원하는 인수를 지정할 수 있습니다.

컬렉션 예 count, map, each 등의 반복 처리가, 전달 인자가 그 이상 반복되는 컬렉션에서 현재 항목 것 방법을 사용.

당신이 내 마틴 오더 스키 (스칼라의 창조자)를 실행되고 있으며 훌륭한 세부 사항에 다음과 같은 사항을 포함 할 것 코 세라 코스 체크 아웃해야합니다 그것에 대해 더 배우고 싶다면 : https://www.coursera.org/course/progfun

+0

정확하게 내가 찾던 설명의 종류 :) 감사. 덧붙여서, 나는 coursera 과정을 수강하고 있으며 코드 스 니펫은 학습 자원 중 하나에 있습니다! – Raj

+0

아하이 봐요. 나는 물론하고있다. 금요일에 만기가 된 행운을 기원합니다. BTW 과제에 대한 최신 정보를 유지할 계획 인 Google 캘린더를 만들었습니다. 원하는 경우 [email protected]이 Google 캘린더의 다른 캘린더에 해당 이메일을 추가합니다. –

1

이 그냥하는 방법을 정의, 당신은 또한이 방법을 볼 수 있습니다.

2

(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-nameby-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).

관련 문제