如何在Scala准引用中插入类型和默认值?

朱利安·皮特斯(Julian Peeters)

我正在尝试制作一个提供最新案例类的类型提供者。

如何拼接类型和默认值(或忽略默认值)?

def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = {
    import c.universe._
    import Flag._

    val result = {
      annottees.map(_.tree).toList match {
        case q"$mods class $name[..$tparams](..$first)(...$rest) extends ..$parents { $self => ..$body }" :: Nil =>
          val valType    = //TODO
          val valDefault = //TODO
          val helloVal   = q"""val x: $valType = $valDefault"""
          q"$mods class $name[..$tparams](..$first, $helloVal)(...$rest) extends ..$parents { $self => ..$body }"
      }
    }
    c.Expr[Any](result)
  }

我试过了:

我已经尝试了简单的方法val valType = q"String",但是随后出现错误,好像找不到默认值:not enough arguments for method apply

我还尝试了将val定义为剪接typeOf[String],并且还尝试了将ValDefs的列表剪接到我的列表中q"$mods class...(就像我q"def...在该站点上的一些类似问题中看到的那样),但是在每种情况下都有一个打字机错误

有小费吗?非常感谢您的光临。

特拉维斯·布朗(Travis Brown)

您可以tq在的定义中使用插值器valType来创建类型树。

其余的有点棘手。如果直接定义额外的参数,它似乎就可以正常工作:

q"""
  $mods class $name[..$tparams](
    ..$first,
    val x: $valType = $valDefault
  )(...$rest) extends ..$parents { $self => ..$body }
"""

但是,当您定义$helloVal然后插入时,最终没有默认参数标志。您可以这样编写一个助手:

def makeDefault(valDef: ValDef) = valDef match {
  case ValDef(mods, name, tpt, rhs) => ValDef(
    Modifiers(
      mods.flags | DEFAULTPARAM, mods.privateWithin, mods.annotations
    ),
    name, tpt, rhs
  )
}

现在,您可以编写以下内容:

val valType    = tq"String"
val valDefault = q""""foo""""
val helloVal   = makeDefault(q"val x: $valType = $valDefault")

一切都应该按预期工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在插入到选择中设置默认值?

如何在表中插入N行默认值

如何在未知列中插入默认值

Scala中类型参数的默认值

如何在DAML中为原始类型和记录指定默认值?

如何在mysql表中插入具有默认值的行

如何在 ARM 模板的参数部分将密钥库中的机密引用为默认值

如何在 Excel vba 中获取对 TextBox 本身的引用而不是其默认值?

Scala:如何在部分函数中定义具有默认值的参数

如何在Scala中弃用具有默认值的参数?

Scala:如何在伴随对象中定义构造函数参数的默认值?

如何在Scala中为varargs参数设置默认值?

如何在MySQL中为SET类型设置1个以上的默认值?

如何在类构造函数中为Map类型变量分配默认值?

如何在Doctrine2 SELECT查询中处理DateTime类型的默认值?

如何在输入类型文本中传递默认值 =“1”

如何在C#中为委托类型的参数提供默认值?

如何在记录类型中添加默认值?- F#

如何在[String]类型的集合中为元素设置默认值?

如何在Postgres中设置复合类型属性的默认值?

SQL / SpatiaLite:从另一个表插入数据时,如何在某些列中插入默认值?

如何在导出默认值中传递值

如何在复选框和单选按钮中设置默认值?

UISelectOne和UISelectMany组件如何在f:selectItems中预选默认值

如何在awk中设置和打印变量的默认值

如何在 Wpf 中为 Kendo RadTreeView 添加或(覆盖默认值)悬停和选择样式

如何在MySQL 5.6中设置AUTO_INCREMENT默认值和增加率

不可空引用类型的默认值VS不可空值类型的默认值

标量-将值插入准引用