当前位置: 首页 > 知识库问答 >
问题:

Scala中的提取器对象和类

农星华
2023-03-14

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

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中做到这一点吗?

共有1个答案

包翔
2023-03-14

您只需使用Scala工具集中的一些实用程序就可以实现这一点

注意模式是如何在匹配大小写中使用的。

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 继承,实例,实例,实例,Scala 单例对象,实例,实例类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。 我们可以使用 new 关键字来创建类的对象,实例如下: 实例 class Point (xc : Int, yc : Int ) {     var x : Int = xc     var y : Int = yc    

  • 类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类是用于创建对象的蓝图,它是一个定义包括在特定类型的对象中的方法和变量的软件模板。 我们可以使用 new 关键字来创建类的对象,实例如下: class Point(xc: Int, yc: Int) { var x: Int = xc var y: Int = yc def move(

  • 主要内容:实例,提取器使用模式匹配,实例提取器是从传递给它的对象中提取出构造该对象的参数。 Scala 标准库包含了一些预定义的提取器,我们会大致的了解一下它们。 Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。 以下实例演示了邮件地址的提取器对象: 实例 object Test {     def m

  • 提取器是从传递给它的对象中提取出构造该对象的参数。 Scala 标准库包含了一些预定义的提取器,我们会大致的了解一下它们。 Scala 提取器是一个带有unapply方法的对象。unapply方法算是apply方法的反向操作:unapply接受一个对象,然后从对象中提取值,提取的值通常是用来构造该对象的值。 以下实例演示了邮件地址的提取器对象: object Test { def main

  • 问题内容: 我想创建一个遵循Scala setters / getters约定的Java类。 我尝试了以下简单的课程,但它不起作用: 但是,当我尝试从scala访问它时: 并且我收到“向val重新分配”的错误消息。我试图寻找这个问题,但是所有问题都从scala到Java出现了。 正确的做法是什么? 谢谢! 问题答案: 您只能这样做,而且您可能不想这样做已经足够困难。 您 不能 做的是编写一个裸露的

  • 我有以下数据结构: 我想把它取出来。以下是我在没有任何运气的情况下正在做的事情: 那我该怎么做? P、 实际上,那是https://github.com/json4s/json4s但这并不重要,因为lift在json提取方面有相同的API。 更新:可能需要使用转换方法。我将如何使用它? 更新2: