[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.아니.
아니.
8.1.7 추출기 패턴
-
==============================
2.변수 설정 추출기 멋진 것,하지만 우리는 지금을 구현하기 위해 자원이 없습니다.
변수 설정 추출기 멋진 것,하지만 우리는 지금을 구현하기 위해 자원이 없습니다.
-
==============================
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.하나는이 같은 암시 적 매개 변수를 사용하여 어느 정도 추출기를 사용자 정의 할 수 있습니다 :
하나는이 같은 암시 적 매개 변수를 사용하여 어느 정도 추출기를 사용자 정의 할 수 있습니다 :
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.직접 수 없습니다 무엇을 요구하고 있지만, 그 경우는 평가의 경우 부분으로 평가 값을 얻는다 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 방법, 꽤 팬이 있기 때문에 나는이 유용한를 찾을 수 있습니다.
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
'SCALA' 카테고리의 다른 글
[SCALA] 아파치 스파크 : java.lang.NoSuchMethodError .rddToPairRDDFunctions (0) | 2019.11.23 |
---|---|
[SCALA] 왜 스칼라 보조 생성자는 다른 생성자에 단일 통화로 구성 할 수 있습니까? (0) | 2019.11.23 |
[SCALA] "=> 외부"정말 무엇을 의미합니까? (0) | 2019.11.23 |
[SCALA] 어떻게 스칼라 미래에 던져 예외를 잡아합니까? (0) | 2019.11.23 |
[SCALA] 스칼라에서 합성 클래스로 싱글 톤? (0) | 2019.11.23 |