Scala中的Extractor对象和类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala中的Extractor对象和类相关的知识,希望对你有一定的参考价值。

我正在为函数表达式编写提取器对象。这是它的样子:

object FunctionTemplate2 {
  private final val pattern = Pattern.compile("^(.+?)\((.+?)\,(.+?)\)")
  //e.g. foo(1, "str_arg")
  def unapply(functionCallExpression: String): Option[(String, String, String)] = {
      //parse expression and extract
  }
}

我可以提取如下:

"foo(1, "str_arg")" match {
  case FunctionTemplate2("foo", first, second) =>
    println(s"$first,$second")
}

但这并不像它可能那么可爱。我想有类似的东西:

case FunctionTemplate2("foo")(first, second) =>
  println(s"$first,$second")

像咖喱提取器。所以我尝试了这个:

case class Function2Extractor(fooName: String){
  private final val pattern = Pattern.compile("^(.+?)\((.+?)\,(.+?)\)")
  println("creating")
  def unapply(functionCallExpression: String): Option[(String, String, String)] = 
    //parse and extract as before
}

但它不起作用:

"foo(1, "str_arg")" match {
  case Function2Extractor("foo")(first, second) =>
    println(s"$first,$second")
}

有没有办法在Scala中执行此操作?

答案

您可以通过在Scala工具集中使用一些实用程序来简单地使用它

请注意在匹配情况下如何使用pattern

Scala REPL

scala> val pattern = "^(.+?)\((.+?)\,(.+?)\)".r
pattern: scala.util.matching.Regex = ^(.+?)((.+?),(.+?))

scala> "foo(1, "str_arg")" match  { case pattern(x, y, z) => println(s"$x $y $z")}
foo 1  "str_arg"

以上是关于Scala中的Extractor对象和类的主要内容,如果未能解决你的问题,请参考以下文章

第28讲:Scala提取器Extractor实战详解

2021年大数据常用语言Scala(三十五):scala高级用法 提取器(Extractor)

scala成长之路对象和类

2021年大数据常用语言Scala(二十八):scala面向对象 MAVEN依赖和类

scala编程——函数和闭包

linux打开终端如何启动scala,如何在终端下运行Scala代码片段?