2011-12-26 4 views
7

'스칼라 프로그래밍, Second Edition의'페이지 (410)에 당신은 클래스 시뮬레이션 다음과 같은 방법을을 찾을 수 있습니다 :Scala에서 패턴 매칭을 사용하는 것이 합당한 간단한 경우가 있습니까?</p> <pre><code>private def next() { (agenda: @unchecked) match { case item :: rest => agenda = rest curtime = item.time item.action() } } </code></pre> <p>Odersky 패턴 그냥 그런 것이 아니라 일치하는이 구현 이유가 궁금 :에서

private def next() { 
    val item = agenda.head 
    agenda = agenda.tail 
    curtime = item.time 
    item.action() 
} 

패턴 일치가 그렇게 중요하지 않으므로 효율적입니까? 아니면 완벽한 예가 아니 었습니까?

답변

9

을 나는 것 당신이 그랬던 것처럼 그것을 쓰십시오. (패턴 매칭은 매우 효율적입니다하더라도, 그것은 헤드/테일만큼 효율적이지 않습니다.) 당신은 패턴이 당신은 MatchException 대신 NoSuchElementException를 원

  • 일치하는 연습을하고 싶었

    1. 경우 일치하는 패턴을 사용하십시오
    2. 나중에 다른 경우를 채울 예정이었습니다.
  • 4

    는 몇 가지 이유가 있습니다 :

    1. 책의 포인트의 일부는 스칼라 (기능) 측면에서 생각을 얻을 것입니다; 패턴 매칭은 기능 - 프로그래밍 등가물입니다.

    2. 패턴 매칭과 기능적 접근은 스칼라에서 자연스러운 패턴이며 동시성과 같은 것을 자연스럽게 허용합니다. 그 패턴을 배우면 스칼라 프로그램이 고급 용도로 사용될 준비가됩니다.

    3

    패턴 일치는 스칼라에서 더 관용적이며 더 쉽게 경계 조건으로부터 당신을 보호합니다. agenda는 빈리스트 인 경우 코드

    private def next() { 
        val item = agenda.head 
        agenda = agenda.tail 
        curtime = item.time 
        item.action() 
    } 
    

    모두 agenda.headagenda.tail에서

    그래서 실제로 당신이에 대한 검사를 추가 할 필요가 작동하도록하는 NoSuchElementException 예외가 발생합니다.

    패턴 매칭 버전은 실제로 (제 의견에 명시된 바와 같이) 비슷한 문제를 가지고 있지만, 당신이해야 할 또 다른 패턴을 추가이기 때문에 나는, 수정 청소기를 찾을 : 일반적으로

    private def next() { 
        (agenda: @unchecked) match { 
        case item :: rest => 
         agenda = rest 
         curtime = item.time 
         item.action() 
        case _ => {} 
        } 
    } 
    
    +0

    패턴이 – gerferra

    +0

    @gerferra 일치하지 않는 경우 MatchException가 발생합니다 버전과 일치하는 패턴 : 패턴 매칭없이, 또한 headtail없이 여기에 대한 대안은 무엇인가처럼 될 수 있습니다. 그러나 어떤 경우에도 패턴 일치 버전은 간단한 수정이 있습니다. 나는 대답을 업데이트 할 것이다. –

    +3

    다른 버전에는 간단한 수정이 있습니다 :'if (! agenda.isEmpty)'를 감싸거나'agenda.headOption.foreach {item => agenda = agenda.tail; curtime = item.time; item.action()}' –

    0

    내 생각에 처음에는 여기에 대한 걱정이 없으므로이 "다음"메서드가 호출되기 전에 일부 검사가있을 것입니다. 실제로, 이것은 아마도 "확인되지 않은"주석의 이유 일 수도 있으므로, 실제로 그는 추가로 case _ =>을 넣을 필요가 없습니다. 나는 추론이 "적용 취소"를 사용하기를 더 원했다고 생각한다. 내가 그렇군요 :

    private def next() { 
        val item :: rest = agenda 
        agenda = rest 
        curtime = item.time 
        item.action() 
    }