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)
}