2011-03-24 5 views
1

나는 스칼라를 배우기 시작했으며, 아마도 나는 조금 야심적이다. StringString에서 Boolean까지의 함수로 매핑하고 싶습니다. 불행히도 필자는 컴파일러에서 얻은 피드백을 실제로 이해하지 못합니다. 내가 Option을 얻는 이유는, 유일한 방법은 기능에 액세스 할 수 있다는 것입니다 모든스칼라 함수 맵

class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     filter : Map[Int, String => Boolean], write : String => Unit) { 
    for(ln <- stdin.getLines) { 
     val inarr = ln split seperator 
     for(i <- key) { 
      val func = filter get i //func : Option[(String) => Boolean] 
      val f = func getOrElse Unit //f : java.lang.Object 
      val res = func(inarr(i)) //Error, doesn't work 
     } 
     //more stuff   
    } 
} 

먼저, 다음은 코드입니다. 둘째, getOrElse가 객체로 반환되는 이유는 무엇입니까? 그 함수를 호출하는 데 사용할 수 있어야하는 것은 아닌가? 누군가 제가 여기서해야 할 일에 대해 간단한 예를 들어 줄 수 있다면 좋을 것입니다.

미리 감사드립니다.

+0

btw, "sepArator"가 아니라 "sepArator"입니다. –

+1

@ DanielC.Sobral 어떤 사람들은 다른 문화를 가지고 있습니다. 그리고 나는 여러분의 문화가 진정한 민족주의라고 주장하는 것은 매우 민족 중심적이라고 생각합니다. OP와 마찬가지로, 나는 A 형태보다 때때로 E 형태를 사용하는 문화이기도합니다. – bharal

+0

@bharal 그런 식으로 생각하면 죄송합니다. 나는 "seperator"를 올바른 철자로 보여주는 사전을 찾을 수 없었다. 정직한 철자법 실수에 대해 다른 사람들이 철자를 개선하는 데 도움이되지 않는 이유는 없습니다. 다른 사람들을 돕기 위해 나를 괴롭히는 대신에, 당신은 문화의 실제 예를 그 철자와 참고 문헌으로 제공하여 도움을 받아야합니다. 실제로 이것은 당신의 실수 대신에 당신의 문화에 대한 철자법입니다. –

답변

3

맵에 특정 키가 있다고 확신하는 경우 직접 가져올 수 있습니다 (filter(i)). get 메서드는 확실하지 않은 경우 (또는 오류에 대해보다 자세히) 사용됩니다. getOrElse을 올바르게 사용하기로 결정한 옵션이 반환됩니다. 그러나 getOrElse((s:String) => /* some boolean */)이 필요합니다. 즉, String에서 Boolean으로 함수를 반환해야합니다. 그런 다음 f을 적용 할 수 있습니다.이 기능은지도에서 성공적으로 얻은 기능이거나 getOrElse에서 제공 한 기본 기능 중 하나입니다.

Unit을 돌려 주겠다고했을 때 무슨 일이 일어 났습니까? 말하자면, "글쎄, 말하자면, 그게 그것이 기능이라면, 그것이 기능이라면, 그것이 단위가 아니라면 ... 내가 할 수있는 모든 것 유형에 대해 말하면 그것은 그것이 객체라는 것입니다. "

어쨌든,

val f = func getOrElse (s: String) => true 
val res = inarr.filter(f) 

같은 난 당신 (지도에서 검색 기능을 사용하여 어레이 inarr을 필터링 할 수있는) 할 노력하고 무슨 생각을 할 것입니다.

+0

아아! 알 겠어. 고마워.나는 '단위'를 사용하여 자기 자신을 호의적으로 생각하고 나중에 결정할 결정을 연기했다고 생각했다. 그동안 나는 발에 총을 맞고 있었다. – delmet

4

Rex가 지적했듯이 Map.get의 유형은 A => Option[B]입니다. 반면 apply 메소드의 유형은 A => B이지만 예외가 발생할 수 있기 때문에 거짓말입니다. 일반적으로이 거짓말로 인해 신청 양식을 사용하지 말 것을 권합니다.

특정 예에서 getOrElse를 전혀 사용하지 않아야합니다. 대신, 어쨌든 부작용을 일으키고 있기 때문에 다음과 같은 것을 시도하십시오. 필자는 'filter'라는 이름을 변경했습니다. Map과 다른 iterables에서 중요한 메서드 이름이기도하고, 그 이름을 오버로드하는 것은 불필요한 혼란의 원인이기 때문입니다. 당신이 이해에 대한의 식의 내부 값을 선언 할 수 있습니다

class StdRead { 
    def read(key : Array[Int], value : Array[Int],seperator : Array[Char], 
     stringTests : Map[Int, String => Boolean], write : String => Unit) { 
    for { 
     ln <- stdin.getLines 
     val inarr = ln split seperator 
     i <- key 
     stringTest <- stringTests.get(i) 
    } { 
     stringTest(inarr(i)) 
    } 
    } 
} 

알 수 있습니다. 이들은 루프가 아니라는 것을 기억하십시오!

+0

답장을 보내 주셔서 감사합니다. 나는 "이해력"에 대해 이해할 수없는 부분을 조사 할 필요가있다. 더 많은 로프가 나와 함께 걸었습니다. 감사!!! – delmet

+0

이해력에 대한 좋은 예! –