2009-12-14 3 views
2

패턴 일치에 사용할 unapply 메서드를 만들려고했지만 Option과 다른 값을 반환하려고했지만 Eclipse에서 오류로 표시합니다. unapplyOption[T]을 반환해야한다는 규칙입니까?적용 취소가 항상 옵션을 반환한다는 규칙입니까?

편집 : 다음은 사용하려는 코드입니다. unapply 부울

import java.util.regex._ 

object NumberMatcher { 
    def apply(x:String):Boolean = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return matcher.find 
    } 

    def unapply(x:String):Boolean = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return matcher.find 
    } 
} 

object x { 
    def main(args : Array[String]) : Unit = { 
    val strings = List("geo12","neo493","leo") 
    for(val str <- strings) { 
     str match { 
     case NumberMatcher(group) => println(group) 
     case _ => println ("no") 
     } 
    } 
    } 
} 

이클립스 wrong number of arguments for object NumberMatcher을 말한다 반환하도록 나는 이전 섹션의 코드를 전환했다. 왜 그런가요?

답변

7

unapply으로 반환하려는 경우 Some 안에 반환하십시오. Boolean을 반환하면 일치 여부를 테스트 할 수 있습니다. 여기

는 패턴 매칭 번역하는 방법입니다 : NumberMatcher 반환 Option[...] 가정

str match { 
    case NumberMatcher(group) => println(group) 
    case _ => println("no") 
} 

, 그것은 할 것입니다 :

val r1 = NumberMatcher.unapply(str) 
if (r1 != None) { 
    val group = r1.get 
    println(group) 
} else { 
    println("no") 
} 

NumberMatcher하면 반환 부울, 당신은 뭔가를받을 수 있습니다. 이 경우 다음과 같은 절차가 진행됩니다

str match { 
    case NumberMatcher() => println("yes") 
    case _ => println("no") 
} 

이가 매우 피상적 ​​ 설명이다

val r1 = NumberMatcher.unapply(str) 
if (r1) { 
    println("yes") 
} else { 
    println("no") 
} 

참고가된다. 대/소문자 일치는 상수를 테스트하고 추가 보호 조건, 대안을 사용하고 unapply을 재귀 적으로 사용하고 unapplySeq 등을 사용합니다. 여기서는 특정 질문을 처리하는 데 아주 기본적인 사용법 만 보여줍니다. 패턴 일치에 대한 자세한 설명을 검색 할 것을 강력히 권합니다.

7

이을 다시보십시오. 나는 다음과 같이 적용 취소의 반환 유형을 선택해야합니다

인용 : 그냥 테스트를하는 경우
이 *, 부울을 반환합니다. 예를 들어 even()
* T 유형의 단일 하위 값을 반환하는 경우 Option [T]
을 반환합니다. * 여러 하위 값 T1, ..., Tn을 반환하려면 다음과 같이 그룹화합니다. 선택적 튜플 옵션 [(T1, ..., Tn)].

+0

당신은 제가 적용 취소의 순서를 수정해야합니다 걸 보여줄 수 그 작동시킬 부울을 반환합니까? – Geo

+0

부울을 반환 할 때 인수를 추출 할 수 없습니다. 그것은 단지'case NumberMatcher() => ...'입니다. – Dario

+0

Option [Unit]이 작동하지 않는다는 것에 놀랐습니다. –

1

unapply을 정의하여 Boolean을 반환하면 패턴에 일치 (또는 바인딩) 할 와일드 카드가 없음을 나타냅니다. 따라서이 unextractor에 대한 case 문은 case NumberMatcher => println(str)이어야하며 채울 변수를 잘못 지정해야합니다.

또한, 우리는 위의 코드뿐만 아니라 이것을 달성 할 수있는 당신이 Option[String]

-2
package com.tutorial.extracters 
object ExtracterwithBooleanReturnType extends App { 
import java.util.regex._ 
object NumberMatcher { 
    def apply(x: String*) = { 
    x 
    } 
    def unapply(x: String): Option[Boolean] = { 
    val pat = Pattern.compile("\\d+") 
    val matcher = pat.matcher(x) 
    return Some(matcher.find) 
} 
} 

val strings = NumberMatcher("geo12", "neo493", "leo") 
for (str <- strings) { 
    str match { 
    case NumberMatcher(group) => println(group) 
    case _ => println("no") 
} 
} 
} 

을 반환 unapply()를 정의 할 필요가 case NumberMatcher(group) => println(group)를 만들기 위해

+0

설명 – tod

관련 문제