如何在 Scala 3 宏中创建泛型类型的实例?

2024-04-28

我正在将宏从 Scala 2 移植到 Scala 3。作为其工作的一部分,Scala 2 宏使用默认构造函数创建泛型类型的实例。在 Scala 2 中使用准引用很容易做到这一点,但我在 Scala 3 宏上遇到了困难。这是迄今为止我最好的方法:

import scala.quoted.*

inline def make[A <: AnyRef]: A = ${ makeThat[A] }

private def makeThat[A <: AnyRef : Type](using Quotes): Expr[A] =
  import quotes.reflect.*

  '{ new A().asInstanceOf[A] }

如果没有.asInstanceOf[A],编译器会发出错误消息:

[error] -- [E007] Type Mismatch Error: ...
[error] 17 |  '{ new A() }
[error]    |     ^^^^^^^
[error]    |Found:    Object
[error]    |Required: A
[error]    |
[error]    |where:    A is a type in method makeThat with bounds <: AnyRef
[error] one error found

有没有更好的解决方案,在运行时不会出现沮丧?

EDIT:从 Scala 3.0.1 开始,这甚至不再编译。


您可以使用较低级别的反射 API 创建正确的树。

import scala.quoted.*

inline def make[A <: AnyRef]: A = ${ makeThat[A] }

def makeThat[A <: AnyRef : Type](using Quotes): Expr[A] =
  import quotes.reflect.*

  TypeRepr.of[A].classSymbol.map( sym =>
    Apply(Select(New(TypeTree.of[A]), sym.primaryConstructor), Nil).asExprOf[A]
  )
  .getOrElse(???) // not a class, so can't instantiate

尽管您应该检查构造函数是否没有参数。

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

如何在 Scala 3 宏中创建泛型类型的实例? 的相关文章

随机推荐

  • 如何将 Slick 插值查询拆分为多行?

    有什么方法可以将 Slick 插值查询拆分为代码中的多行吗 我的查询往往会变得相当长 所以我寻找类似以下的东西 val query sql select from DOCUMENTS sql where language lang orde
  • jQuery 文本区域中的每一行

    html
  • CDO.消息编码问题

    我们目前正在将邮件递送系统更改为仅使用UTF 8 发件人姓名似乎有问题 当电子邮件包含非 ASCII 字符 希伯来语 时 主题和正文呈现正常 但发件人姓名 如出现在我的 gmail 帐户中 变为 有一行代码 myMail BodyPart
  • 是否需要显式事务回滚?

    许多例子都主张显式回滚数据库事务 大致如下 using var transaction try do some reading and or writing here transaction Commit catch SqlExceptio
  • 查找数组中是否有任何项目符合条件

    我是 JavaScript 新手 现在 我有一个包含多个对象的数组 因此 我想迭代它 如果任何对象与条件匹配 那么我想返回一个值并停止该循环 我的 obj 数组就像 var obj type numberOfQuestions techno
  • 在生产 PostgreSQL 连接中将rejectUnauthorized 设置为 false 可以吗?

    我们最近转移到 Heroku 并在尝试将我们的应用程序连接到数据库时 它不断拒绝我们的查询 并显示消息 自签名证书 传入rejectUnauthorized解决了这个问题 但现在我想知道 我们应该在生产中这样做吗 如果没有 我们连接到 He
  • 尝试导入 cv2(opencv-python) 包时出错

    我正在尝试使用 cv2 opencv python 包访问我的网络摄像头 当我尝试导入它时 出现此错误 Traceback most recent call last File server py line 6 in
  • 在普罗米修斯中找不到查询 label_values [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 在 Grafana 文档中 我发现我应该能够查询我的 Prometheus 服务器以获取使用以下命令提供监控数据的所有实例 lab
  • Mysql使用tenant_id进行复合索引

    我们有一个多租户应用程序 该应用程序有一个包含 129 个字段的表 这些字段都可以在 WHERE 和 ORDER BY 子句中使用 我花了 5 天的时间试图找出最适合我们的索引策略 我获得了很多知识 但我仍然有一些问题 1 创建索引时 我应
  • 组件输入属性上的双向数据绑定

    我正在尝试在 angular2 上做一些事情 但我无法找到有关此行为的信息 我有一个应用程序实现像这样的自定义组件 import Component Input from angular2 core Component selector m
  • 如何将目录结构解析为字典?

    我有目录结构列表 例如 a b a b c a b c d a b c e a b c f g a b c f h a b c f i 我想将它转换成像树结构一样的字典 a b c d None e None f g None h None
  • TwinCAT 3:写入文件

    我想从 PLC 中导出一些数据 方法是将其写入文本文件并将其保存到 USB 记忆棒中 我设法创建了文本文件 但我无法写入任何内容 我在以下代码中使用 TwinCAT 标准库中的函数 PROGRAM P WriteFile VAR nStat
  • Yii框架2.0添加媒体打印到css链接

    使用 Yii 框架 2 0 我包含一个 css 文件 其中包含以下代码资产 AppAsset php public css css style css 当我在网络浏览器上检查元素时 我在标题标记中看到以下代码 我想添加打印 css到网页媒体
  • 光线追踪三角形

    我正在用java编写一个光线追踪器 并且我能够追踪球体 但我相信我追踪三角形的方式有问题 据我了解 这是基本算法 首先确定射线是否与plane三角形已打开 剪裁所有点 使它们与三角形位于同一平面上 因此xy以平面为例 根据沿着新平面向任意方
  • 使用as3在第二帧上添加影片剪辑

    如何使用 AS3 类中调用的 addChild 在特定帧上添加影片剪辑 我的问题是如何访问特定的框架 谢谢 棘手的事情是处理帧 实时循环 我会这样做的方式是 添加事件监听器FRAME CONSTRUCTED http help adobe
  • 在系统范围内向 Mac 窗口标题栏添加按钮

    我希望能够添加一个按钮标题栏 https developer apple com design human interface guidelines macos windows and views window anatomy of Mac
  • 文档何时添加到 MongoDB 集合中

    我有一个现有的 mongodb 集合 它没有有关文档创建时间的任何信息 是否可以通过某种方式获取此信息 我已经浏览了文档 但在任何地方都看不到它 如果您使用默认的ObjectId为您的价值 id属性 创建时间被编码在其中 如中所述Objec
  • 如何通过 JavaScript 函数在 HTML5 画布上绘制多边形

    我希望用户能够单击画布上的某个位置 多边形就会出现在上面 div class rounded div
  • Sourcetree/GIT - 拉取时无法锁定引用/引用损坏

    我和一位同事在同一个分支上工作了一周 不断地推送 拉取更改 今天突然 我点击 拉取 以查看是否有任何需要拉取的更改 但出现了错误 顺便说一下 这是在 sourcetree 中的 错误是这样的 git c diff mnemonicprefi
  • 如何在 Scala 3 宏中创建泛型类型的实例?

    我正在将宏从 Scala 2 移植到 Scala 3 作为其工作的一部分 Scala 2 宏使用默认构造函数创建泛型类型的实例 在 Scala 2 中使用准引用很容易做到这一点 但我在 Scala 3 宏上遇到了困难 这是迄今为止我最好的方