복붙노트

[SCALA] 추출기 (추출기를 사용할 것이라고 또는 다른 곳) case 문의 몸에있는 매개 변수를 사용자 정의 할 수 있습니까?

SCALA

추출기 (추출기를 사용할 것이라고 또는 다른 곳) case 문의 몸에있는 매개 변수를 사용자 정의 할 수 있습니까?

기본적으로, 나는 그것을 사용하기 전에 변수에 저장하지 않고도 사용자 지정 추출기를 구축 할 수 있도록하고 싶습니다.

이것은 내가 그것을 사용하는 것이 방법, 그것은 가능성이 정규 표현식 또는 구조와 같은 다른 문자열 패턴의 경우에 사용되는의 실제 예 아니다, 그러나 희망은 내가 무엇을 찾고 설명 :

def someExtractorBuilder(arg:Boolean) = new {
  def unapply(s:String):Option[String] = if(arg) Some(s) else None
}

//I would like to be able to use something like this 
val {someExtractorBuilder(true)}(result) = "test"
"test" match {case {someExtractorBuilder(true)}(result) => result }

//instead I would have to do this:
val customExtractor = someExtractorBuilder(true)
val customExtractor(result) = "test"
"test" match {case customExtractor(result) => result}

단지 하나의 사용자 정의 추출기를 수행 할 때 그것은 많은 차이가되지 않습니다,하지만 당신은 case 문에 대한 추출기의 큰 목록을 구축한다면, 그것은 그들의 사용에서 추출기을 모두 분리하여 읽을 것을 더 어렵게 만들 수 있습니다.

나는 대답은 당신이이 작업을 수행 할 수있는 것을 기대하지,하지만 난 내가 먼저 주위에 물어 거라고 생각 : D를

해결법

  1. ==============================

    1.아니.

    아니.

    8.1.7 추출기 패턴

  2. ==============================

    2.변수 설정 추출기 멋진 것,하지만 우리는 지금을 구현하기 위해 자원이 없습니다.

    변수 설정 추출기 멋진 것,하지만 우리는 지금을 구현하기 위해 자원이 없습니다.

  3. ==============================

    3.늦은하지만 구문 ~ 제공하는 내 LIB 중 하나에 scalac 플러그인 (extractorWith (PARAM)를 바인딩)이있다 :

    늦은하지만 구문 ~ 제공하는 내 LIB 중 하나에 scalac 플러그인 (extractorWith (PARAM)를 바인딩)이있다 :

    x match {
      case ~(parametrizedExtractor(param)) => 
        "no binding"
      case ~(parametrizedExtractor(param), (a, b)) =>
        s"extracted bindings: $a, $b"
    }
    

    https://github.com/cchantep/acolyte/blob/master/scalac-plugin/readme.md

  4. ==============================

    4.하나는이 같은 암시 적 매개 변수를 사용하여 어느 정도 추출기를 사용자 정의 할 수 있습니다 :

    하나는이 같은 암시 적 매개 변수를 사용하여 어느 정도 추출기를 사용자 정의 할 수 있습니다 :

    object SomeExtractorBuilder {
      def unapply(s: String)(implicit arg: Boolean): Option[String] = if (arg) Some(s) else None
    }
    
    implicit val arg: Boolean = true
    "x" match {
      case SomeExtractorBuilder(result) =>
        result
    }
    

    모든 경우 문이 같은 범위에있는대로, 한 경기에서 서로 다른 변종을 사용하고자 할 때 불행하게도이 사용할 수 없습니다. 아직도, 그것은 유용 가끔 수 있습니다.

  5. ==============================

    5.직접 수 없습니다 무엇을 요구하고 있지만, 그 경우는 평가의 경우 부분으로 평가 값을 얻는다 contaner 복귀 추출기를 생성 할 수있다. 는 IF 부에 매개 변수를 제공하는 것이 가능하다.

    직접 수 없습니다 무엇을 요구하고 있지만, 그 경우는 평가의 경우 부분으로 평가 값을 얻는다 contaner 복귀 추출기를 생성 할 수있다. 는 IF 부에 매개 변수를 제공하는 것이 가능하다.

    object DateExtractor {
      def unapply(in: String): Option[DateExtractor] = Some(new DateExtractor(in));
    }
    
    class DateExtractor(input:String){
      var value:LocalDate=null;
      def apply():LocalDate = value;
      def apply(format: String):Boolean={
        val formater=DateTimeFormatter.ofPattern(format);
        try{
          val parsed=formater.parse(input, TemporalQueries.localDate());
          value=parsed
          true;
        } catch {
          case e:Throwable=>{
            false
          }
        }
      }
    }
    

    용법:

    object DateExtractorUsage{
      def main(args: Array[String]): Unit = {
        "2009-12-31" match {
          case DateExtractor(ext) if(ext("dd-MM-yyyy"))=>{
            println("Found dd-MM-yyyy date:"+ext())
          }
          case DateExtractor(ext) if(ext("yyyy-MM-dd"))=>{
            println("Found yyyy-MM-dd date:"+ext())
          }
          case _=>{
            println("Unable to parse date")
          }
        }
      }
    }
    

    이 패턴은 코드 조각의 PartialFunction 자연을 보존합니다. 내가 추출기 세트를 precreating 공간을 떠나지 않아 일반적으로 매개 변수로 부분적인 기능을하고, 수집 / collectFirst 방법, 꽤 팬이 있기 때문에 나는이 유용한를 찾을 수 있습니다.

  6. from https://stackoverflow.com/questions/2411573/can-extractors-be-customized-with-parameters-in-the-body-of-a-case-statement-or by cc-by-sa and MIT license