如何在 reify 子句中使用 Scala 宏中计算的类型?

2024-02-28

我一直在使用 Scala 宏,并在宏中包含以下代码:

    val fieldMemberType = fieldMember.typeSignatureIn(objectType) match {
      case NullaryMethodType(tpe)   => tpe
      case _                      => doesntCompile(s"$propertyName isn't a field, it must be another thing")
    }

    reify{
      new TypeBuilder() {
        type fieldType = fieldMemberType.type
      }
    }

正如你所看到的,我已经设法得到了c.universe.Type fieldMemberType。这表示对象中某个字段的类型。一旦我明白了,我想创建一个新的TypeBuilder具体化中的对象。TypeBuilder是一个带有抽象参数的抽象类。这个抽象参数是fieldType。我要这个fieldType是我以前发现的类型。

运行此处显示的代码会返回一个fieldMemberType not found。有什么办法可以让我得到fieldMemberType在 reify 子句中工作?


问题是你传递给的代码reify本质上将逐字放置在宏展开的位置,并且fieldMemberType在那里没有任何意义。

在某些情况下你可以使用splice将宏扩展时的表达式隐藏到正在具体化的代码中。例如,如果我们尝试创建此特征的实例:

trait Foo { def i: Int }

并且在宏展开时有这个变量:

val myInt = 10

我们可以这样写:

reify { new Foo { def i = c.literal(myInt).splice } }

这在这里不起作用,这意味着你将不得不忘记漂亮的小东西reify并手写出 AST。不幸的是,你会发现这种情况经常发生。我的标准方法是启动一个新的 REPL 并输入如下内容:

import scala.reflect.runtime.universe._

trait TypeBuilder { type fieldType }

showRaw(reify(new TypeBuilder { type fieldType = String }))

这将输出几行 AST,然后您可以将其剪切并粘贴到宏定义中作为起点。然后你摆弄它,替换如下内容:

Ident(TypeBuilder)

有了这个:

Ident(newTypeName("TypeBuilder"))

And FINAL with Flag.FINAL, 等等。我希望toStringAST 类型的方法与构建它们所需的代码更准确地对应,但您很快就会明白需要更改哪些内容。你最终会得到这样的结果:

c.Expr(
  Block(
    ClassDef(
      Modifiers(Flag.FINAL),
      anon,
      Nil,
      Template(
        Ident(newTypeName("TypeBuilder")) :: Nil,
        emptyValDef,
        List(
          constructor(c),
          TypeDef(
            Modifiers(),
            newTypeName("fieldType"),
            Nil,
            TypeTree(fieldMemberType)
          )
        )
      )
    ),
    Apply(Select(New(Ident(anon)), nme.CONSTRUCTOR), Nil)
  )
)

Where anon是您预先为匿名类创建的类型名称,并且constructor是一种方便的方法,我用它来使这种事情不那么可怕(你可以在末尾找到它的定义)这个完整的工作示例 https://gist.github.com/4249936).

现在如果我们把这个表达式包装成类似的东西this https://gist.github.com/4249936,我们可以写如下:

scala> TypeMemberExample.builderWithType[String]
res0: TypeBuilder{type fieldType = String} = $1$$1@fb3f1f3

所以它有效。我们采取了一个c.universe.Type(我从这里得到的WeakTypeTag类型参数的builderWithType,但它的工作方式与任何旧的完全相同Type)并用它来定义我们的类型成员TypeBuilder trait.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 reify 子句中使用 Scala 宏中计算的类型? 的相关文章

  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 如何将 scala 列表转换为 javascript 数组?

    有更简单的方法吗 document ready function var jsArray if scalaList null for id lt scalaList jsArray push id 很简单 如下所示 import play
  • 在 Akka 中配置嵌套 Router

    我有一些嵌套的路由器 应创建它FromConfig 我想要的是这样的 test akka actor deployment worker router round robin nr of instances 5 slave router b
  • Scala 2.9 无法在 Windows XP 上运行“hello world”示例

    我正在尝试在 Windows XP 上使用 scala 2 9 1 Final 运行 HelloWorld 示例 object HelloWorld extends App println Hello World 文件另存为Hello sc
  • Akka Stream Graph 恢复问题

    我创建了一个图表来并行化具有相同输入的两个流 这些流产生 Future Option Entity 如果 flowA 失败 我想返回 Future None 但恢复似乎没有被调用 val graph Flow Input Future Op
  • 高效序列化案例类

    对于我正在工作的图书馆 我需要提供一个高效 便捷 typesafe序列化 scala 类的方法 理想的情况是用户可以创建一个案例类 并且只要所有成员都是可序列化的 它似乎也应该如此 我准确地知道序列化和反序列化阶段的类型 因此不需要 也不能
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • Scala:什么是 CompactBuffer?

    我试图弄清楚 CompactBuffer 的含义 和迭代器一样吗 请解释其中的差异 根据 Spark 的文档 它是 ArrayBuffer 的替代方案 可以提供更好的性能 因为它分配的内存更少 以下是 CompactBuffer 类文档的摘
  • 理解 Scala FP 库

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 如何在映射中将字符串转换为 Seq[String]

    我有一个Map String String 以及需要的第三方功能Map String Seq String 有没有一种简单的方法来转换它 以便我可以将地图传递给函数 original mapValues Seq 注意mapValues返回地
  • Slick和bonecp:org.postgresql.util.PSQLException:FATAL:抱歉,太多客户端已经错误

    当我在本地开发应用程序时 我使用以下命令启动我的 play2 应用程序sbt run 我喜欢如何更改代码 然后重新加载浏览器以查看我的更改 在大约 10 次代码更改之后 我收到 postgresql 太多连接错误 见下文 我的数据库连接使用
  • 获取SettingKey[T]的值

    我正在开发一个用于文档生成的插件 我想将所有生成的文件输出到我选择的目录中 该目录可以是SBT的子目录target目录 如下 val newTargetDirectory SettingKey File document target di
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • Spark scala 模拟 Spark.implicits 用于单元测试

    当尝试使用 Spark 和 Scala 简化单元测试时 我使用 scala test 和mockito scala 以及mockito Sugar 这只是让你做这样的事情 val sparkSessionMock mock SparkSes
  • 使用 Shapeless 记录组合任意数量的状态更改函数

    我正在尝试移植combineReducers从 Redux 到 Scala 这个想法是每个函数控制它的一小部分状态并且combineReducers创建一个控制整个状态的函数 我无法找出应该像这样工作的函数所需的签名 sealed trai
  • 正确使用术语 Monoid

    从下面的例子来看 我认为这样的说法是正确的String在串联运算下定义了一个幺半群 因为它是关联二元运算 并且String碰巧有一个身份元素 它是一个空字符串 scala gt Jane Doe Jane Doe res0 Boolean
  • Scala:类型参数中的问号

    我试图理解以下代码 来自 Scalaz 库 def kleisliIdApplicative R Applicative Kleisli Id R 我假设一种形式T P0 是一个带有参数的类型构造函数 但是我无法找到解释类型参数中问号用法的
  • Scala 的“神奇”函数列表

    在哪里可以找到 Scala 的 神奇 函数列表 例如apply unapply update etc 魔法函数是指编译器的某些语法糖使用的函数 例如 o update x y lt gt o x y 我用谷歌搜索了一些组合scala mag
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • Spark:查找前 n 个值的高性能方法

    我有一个很大的数据集 我想找到具有 n 个最高值的行 id count id1 10 id2 15 id3 5 我能想到的唯一方法是使用row number没有分区就像 val window Window orderBy desc coun

随机推荐

  • 获取this.title属性的前2个字符,并调用对应的id

    我试图检索链接标题属性的前两个字符 将其存储到变量中 然后将该变量作为函数调用 在代码中 它说 s 是我想要放置该值的位置 有任何想法吗 flow click function if labelstatus 1 rmflow a weflo
  • 错误:“使用移动值”

    我目前正在学习 Rust 并且正在使用一个简单的计算器 重构时 我最终得到了如下代码 enum OptionalToken Foo Bar fn next token gt OptionalToken Read input classify
  • JavaScript:如何动态“过滤”我的对象

    我如何使用 JavaScript filter 属性作为过滤器我的 JavaScript 对象 我一直在阅读以下内容StackOverflow 帖子 https stackoverflow com questions 1694717 jav
  • 如何使用 Firefox Addon Builder 记录选定的文本?

    我遵循了几个教程但没有成功 我认为这是一个经典的例子 但我无法让它发挥作用 我可以保存我的项目 安装插件 当我选择一些文本时 我可以看到上下文菜单项 日志选择 但是当我单击它时 什么也没有发生 exports main function v
  • jquery 上下文选择器与 .find()

    什么更有效 var container container 1 var links1 container find a 2 var links2 a container 我个人比较喜欢 a container 因为看起来更好 但是它们的性能
  • Makefile `echo -n' 不起作用

    我试图让我的 Makefile 回显文本而不带尾随换行符 但我做不到 我在 OS X 上遇到了这种行为 在 Linux 上一切都按预期工作 Makefile a echo n hello b echo n hello c bin echo
  • 根据控制器响应动态更改视图部分

    我正在寻找以下场景的最佳方法建议 用户可以选择一个或多个 csv 文件进行验证 附件 1 单击 验证 按钮会执行验证代码 显示进度条 直到返回输出 返回响应可以是成功消息 也可以是选择验证的每个文件的错误详细信息 附件 2 现在可以使用 上
  • Makefile:目标依赖项 - 如何始终制作它?

    This will most probably be obvious and or a banality But since I am trying different approaches for hours without succes
  • Entity Framework 4 生成的查询正在连接完整表

    我有两个实体 Master 和Details 当我查询它们时 对数据库的查询结果是 SELECT Extent2 needed columns listed here Extent1 needed columns listed here F
  • 将自定义视图添加到工具栏

    我现在正在与 Cocoa 斗争两个小时 但没有成功 我想向工具栏添加自定义视图 因此 我向窗口添加了一个 NSToolbar 使用 IB 并添加了我的视图 效果完美 IB自动创建了一个NSToolbarItem 我按照苹果的说明进行操作 h
  • 将 Sencha Touch 与 jQuery 相结合

    我已经在 Sencha Touch 工作了几个星期 虽然这个框架非常强大 但我仍然发现它有一些难以使用的地方 特别是用于复杂嵌套 JSON 结果的 JSONP 数据存储 因此 我决定结合 jQuery 有用的 AJAX 和 JSON 函数
  • 拉直 B 样条线

    我插入了一条样条曲线 以将图像中的像素数据与我想要拉直的曲线相匹配 我不确定什么工具适合解决这个问题 有人可以推荐一种方法吗 这是我获取样条线的方法 import numpy as np from skimage import io fro
  • 有什么理由将 out 参数与 C# 7 元组返回值一起使用? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我刚刚观看了一个介绍C 7的新特性 https www youtube com watch v 5ju2MuqKf 8 除此之外 它引入了返回元
  • 内置对象/库的静态初始化顺序惨败

    如果我有一些静态初始化的变量 在main开始 我可以自由使用这些构造函数中的任何内置内容吗 例如
  • 使用php连接外部mysql数据库

    服务器之间可以连接mysql数据库吗 我的意思是 假设我在 2 个不同的托管服务上有 2 个帐户 其中一个有数据库 我想用 php 从另一个帐户连接它 当我尝试时 我收到 警告 mysql connect function mysql co
  • C++ 中的最小浮点正值

    C 中乘法逆元仍然有限的最小正值是多少 试过numeric limits
  • 在线验证antlr语法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道是否存在某种用于antlr语法的在线测试环境 我可以在其中针对某些输入字符串验证和测试给定的语
  • (如何)我可以在 Docker 容器中运行 Windows Defender 吗?出现错误[关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我正在为 Windows 环境的端点笔测试实验室尝试一些选项 Docker 似乎是一个非常轻量级且易于配置的选项 然而 在这个设置中测
  • 如何在 JavaScript 或 jQuery 中进行 ping 操作?

    我想用 Javascript 创建一个类似游戏的 ping 就像 反恐精英 游戏一样 我正在对服务器 MySQL 进行 AJAX 调用 并想要计算所花费的时间 但我要么计算错误 要么对 ping 的想法有误 这是我到目前为止的代码 var
  • 如何在 reify 子句中使用 Scala 宏中计算的类型?

    我一直在使用 Scala 宏 并在宏中包含以下代码 val fieldMemberType fieldMember typeSignatureIn objectType match case NullaryMethodType tpe gt