Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在变量中存储长准整数匹配器_Scala_String Interpolation_Scala Quasiquotes - Fatal编程技术网

Scala 在变量中存储长准整数匹配器

Scala 在变量中存储长准整数匹配器,scala,string-interpolation,scala-quasiquotes,Scala,String Interpolation,Scala Quasiquotes,我试图避免在比赛中重复长准球。因此,我想将其转换为: def appendTree(clazz:ClassDef,tree:tree):ClassDef= 克拉兹比赛{ 案例q“$mods class$tpname[…$TPARMS]$ctorMods(…$PARAMS)使用..$parents{$self=>..$stats}扩展了{..$earlydefns}”=> q“$mods class$tpname[..$tparams]$ctorMods(..$paramss)使用..$paren

我试图避免在比赛中重复长准球。因此,我想将其转换为:

def appendTree(clazz:ClassDef,tree:tree):ClassDef=
克拉兹比赛{
案例q“$mods class$tpname[…$TPARMS]$ctorMods(…$PARAMS)使用..$parents{$self=>..$stats}扩展了{..$earlydefns}”=>
q“$mods class$tpname[..$tparams]$ctorMods(..$paramss)使用..$parents{$self=>..$stats;..$tree}扩展了{..$earlydefns}”
}
对这样的事情:

val clazzQuote=“$mods class$tpname[..$tparams]$ctorMods(..$paramss)使用..$parents{$self=>..$stats}扩展{..$earlydefns}”
def appendTree(clazz:ClassDef,tree:tree):ClassDef=
克拉兹比赛{
案例q“$clazzQuote”=>
q“$mods class$tpname[..$tparams]$ctorMods(..$paramss)使用..$parents{$self=>..$stats;..$tree}扩展了{..$earlydefns}”
}
我尝试使用字符串插值的一个类似示例:

val msg=“你好$name”
“你好世界”比赛{
case s“$msg”=>println(name)//我希望它输出“world”
}
这也是一个例子

我该怎么做?(或者我可以吗?)

你不会写字

val msg = s"hello $name" // name doesn't make sense here

在Scala中,模式匹配不是这样工作的

你也可以写

clazz match {
  case q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats }" =>
    q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats; $tree }"
}

如果不需要所有参数,可以使用下划线

clazz match {
  case q"$_ class $tpname[..$_] $_(...$_) extends $_" =>
    println(tpname)
}

在复杂情况下,可以使用自定义提取器对象

若您经常向类主体添加树,那个么可以引入helper方法

def modifyBody(clazz: ClassDef, f: List[Tree] => List[Tree]): ClassDef =
  clazz match {
    case q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats }" =>
      q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..${f(stats)} }"
  }

def appendTree(clazz: ClassDef, tree: Tree): ClassDef = {
  clazz match {
    case c => modifyBody(c, stats => stats :+ tree)
}

嗯,看起来我最好不要使用Quasikote,因为如果没有它的话,它看起来就不那么凌乱了。这确实是一个很好的答案。谢谢
clazz match {
  case c: ClassDef =>
    val i = c.impl
    ClassDef(c.mods, c.name, c.tparams, Template(i.parents, i.self, i.body :+ tree))
}
clazz match {
  case q"$_ class $tpname[..$_] $_(...$_) extends $_" =>
    println(tpname)
}
clazz match {
  case q"$_ class $_[..$_] $_(...$_) extends { ..$_ } with ..$parents { $_ => ..$_ }" =>
    println(parents)
}
def modifyBody(clazz: ClassDef, f: List[Tree] => List[Tree]): ClassDef =
  clazz match {
    case q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..$stats }" =>
      q"$mods class $tpname[..$tparams] $ctorMods(...$paramss) extends { ..$earlydefns } with ..$parents { $self => ..${f(stats)} }"
  }

def appendTree(clazz: ClassDef, tree: Tree): ClassDef = {
  clazz match {
    case c => modifyBody(c, stats => stats :+ tree)
}