获取Scala3宏中的类型信息

2023-12-13

我正在努力获取 Scala3 宏实现中的类型信息。我将通过代码来解释问题。

应用逻辑如下:

object BlockServiceImpl extends BlockService:
  def authenticateUser0() = new ServiceCall[AuthUser,AuthUserResponse]:
     def invoke(request: AuthUser): Future[AuthUserResponse] = 
       println("BlockServiceImpl authenticateUser0 called")
       Future.successful(AuthUserResponse("test"))   

现在,对于逻辑,我想在宏的帮助下创建端点。

defineRoute("POST","/v1/block",BlockServiceImpl.authenticateUser0)

这是内联方法:

inline def defineRoute[Q: RootJsonFormat ,R: RootJsonFormat](method: String, uri: String,inline call: () =>  ServiceCall[Q,R]): AkkaHttpCall = ${ methodImpl[Q,R]('uri, 'call)}

这是宏的实现:

def methodImpl[Q: Type,R: Type](uri: Expr[String],expr: Expr[Function0[ServiceCall[Q,R]]])(using ctx: Quotes): Expr[AkkaHttpCall] = ...

我怎样才能得到这样的信息Q is AuthUser编译时宏扩展期间的类型?


一个可能的解决方案是使用引用表达式的模式匹配.

例如,您可以定义一个用于检索编译时类型的方法:

def tag[A <: AnyKind] = throw new IllegalStateException("use it only to pattern match types")

然后,在宏扩展中,您可以执行模式匹配:

'{ tag[Q] } match {
      case '{ tag[AuthUser] } => // here I am sure that Q is AuthUser, since Q is matched with AuthUser
}

这是一个相当大的技巧(并且扩展性不是很好,因为您必须添加每种类型),因此请对我所说的一切持保留态度......我认为存在更清晰的解决方案取决于您特定的应用程序逻辑:)

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

获取Scala3宏中的类型信息 的相关文章

  • 如何创建一个扩展为“(x+y*240)*2”这样的表达式的 GNU GAS 宏?

    我正在使用 GAS 为 ARM Linux 构建一个程序 但我想做一些宏以使我的开发更加智能 然后我想知道 我怎样才能为此做一个宏 x y 240 2 were x and y are int 将像这样使用 mov r0 MACRO SHO
  • 如何从 Scala repl 中取消导入隐式?

    是否可以从 repl 中取消导入隐式内容 说我做这样的事情 scala gt import scala math BigInt import scala math BigInt scala gt implicits 2 implicit m
  • 将无形状 HList 转换为 TupleN,其中元组形状不需要与 HList 形状完全匹配

    我想创建相当于 def toTupleN A1 AN L lt HList l L TupleN A1 AN 代码使用toTupleN仅当恰好有一个时才应该编译N中的值的组合l可以从中创建元组 其他任何内容都应该生成编译时错误 应考虑可用的
  • 为什么调用 take() 方法时 Slick 会生成子查询

    I use Slick http slick typesafe com 1 0 0 RC1 我对表对象有这样的定义 object ProductTable extends Table Int String String String Dou
  • Liftweb 环境中的后台任务

    我必须编写守护进程 并且我想使用模型来连接到数据库和一些有用的 Lift 类 是否可以运行 Rails 的 rake 任务的模拟 Scala 社区组上也有类似的问题 答案是使用Actors来做后台处理
  • 了解如何使用 apply 和 unappy

    我试图更好地理解 的正确用法apply and unapply方法 考虑到我们想要序列化和反序列化的对象 这是正确的用法吗 即斯卡拉方式 的使用apply and unapply case class Foo object Foo appl
  • Clojure 中的宏和函数

    我在这个 Clojure 教程中读到了以下行 http java ociweb com mark clojure article html Macros http java ociweb com mark clojure article h
  • 对于空列表,max() 应该返回什么?

    Got java util NoSuchElementException head of empty list所以我试着检查一下 但现在我明白了 info max of a few numbers FAILED info 0 did not
  • Scala:具有复杂结构的树插入尾递归

    我正在 scala 中创建自定义对象树 并且我的插入方法引发堆栈溢出 因为它不是尾递归 但是 我不太清楚如何使其尾递归 我见过使用 累加器 变量的相关示例 但它们要么是只能相乘和覆盖的整数之类的东西 要么是我在适应树时遇到困难的列表 这是我
  • 有没有办法捕获 Spark 中使用通配符读取的多个 parquet 文件的输入文件名?

    我使用 Spark 将多个 parquet 文件读取到单个 RDD 中 并使用标准通配符路径约定 换句话说 我正在做这样的事情 val myRdd spark read parquet s3 my bucket my folder parq
  • 使用 Akka 玩 2.5 - 找不到参数超时的隐式值:akka.util.Timeout

    我正在尝试使用 Play 2 5 测试 Akka 但遇到了一个似乎无法解决的编译错误 我正在关注 Play 文档中的此页面 https playframework com documentation 2 5 x ScalaAkka http
  • 使用 Spray-json 解析简单数组

    我正在尝试 但失败了 了解 Spray json 如何将 json feed 转换为对象 如果我有一个简单的 key gt value json feed 那么它似乎可以正常工作 但是我想要读取的数据出现在如下列表中 name John a
  • Scala 如何忽略 Java 的检查异常?

    例如如果调用 JavaThread sleep这会抛出一个已检查的InterruptedException来自 Scala 源文件 然后不需要将调用包含在 Scala 中try catch Scala 如何删除将调用包围在 a 中的规则tr
  • 如何捕获 Oozie Spark 输出

    有没有办法捕获spark的输出然后将其输入到shell上 我们当前正在使用 scala 创建 jar 文件 并希望我们的 Spark 输出成为 shell 输入 我的想法是使用 wf actionData spark XXXX var 我只
  • Java 表达式树 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有相当于 net的 LINQ 下的表达式树JVM 我想实现一些类似 LINQ 的代码结构Scala
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s
  • Scala Tuple2Zipped 与 IterableLike zip

    两种实现有什么区别 这个比那个好吗 有一篇博客文章说 Tuple2Zipped 性能更好 但没有提供原因 并且查看源代码我没有看到差异 val l1 List 1 2 3 val l2 List 5 6 7 val v1 l1 zip l2
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • 用于解析 Rust 中的匹配臂的递归宏

    我正在尝试编写一个宏来将一组规则扩展为执行标记匹配的代码 但无法在不导致宏扩展错误的情况下生成正确的代码 我知道我可以通过其他方式处理这个问题 但这里的关键问题不是如何解析令牌 而是如何编写一个可以使用匹配臂递归扩展令牌树的宏 这个想法是我
  • 在 Scala 中,使用“_”和使用命名标识符有什么区别?

    为什么当我尝试使用时会出现错误 而不是使用命名标识符 scala gt res0 res25 List Int List 1 2 3 4 5 scala gt res0 map gt item toString

随机推荐

  • 与 C 信号的简单同步

    我正在尝试解决一个要求以下问题的练习 启动进程必须分叉两次 父亲和孩子必须同步写入 一个接一个地在临时文件的第一个位置读取写入在三个不同的字符上的字符 文件 每个进程一个 程序必须使用信号来实现同步机制 到目前为止 我已经尝试通过这样做来解
  • Flutter:Firebase Cloud Storage 中文件夹中的文件列表

    我需要从云存储加载一些图像文件 对于给定的文件夹 我需要检查其中有哪些图像 如果有 可用 看起来像 firebase 客户端库 https pub dev packages firebase storage 没有一个简单的方法可以做到这一点
  • 使用 C++11 正则表达式捕获上下文无关语法文件的内容

    Preface 我正在尝试编写自己的上下文无关语法规范 以与我的词法分析器 解析器的规则相关联 它的意思是类似于ANTLR 其中大写标识符分类为词法分析器规则 小写标识符分类为解析器规则 它旨在接受词法分析器规则的字符串文字和 或正则表达式
  • 我的计算机中的 Java SDK 文件夹在哪里?乌班图12.04

    我知道它已安装 因为当我输入 java version I get OpenJDK Runtime Environment IcedTea6 1 12 5 6b27 1 12 5 0ubuntu0 12 04 1 OpenJDK 64 Bi
  • 在代码块之前和之后执行方法

    我如何将一些代码括在括号中以执行以下操作 MyCustomStatement args code goes here 这样 在括号中的代码执行之前 它将调用一个方法 当括号中的代码执行完成时 它将调用另一个方法 有这样的事吗 我知道当我可以
  • 如何在 Xamarin 表单 Android 和 iOS 中实现 Deeplink(通用链接)?

    各位 我需要一步步实现Android和iOS的Applink 通用链接 请任何人帮助实现这一点 我在我的android项目中尝试了以下代码 我按照这个网址写了这个https devblogs microsoft com xamarin co
  • 如何检查 C++ 类是否不完整(仅声明)?

    我想编写一个 C 函数来检查其模板参数类是否不完整 因此只有类声明可用 但没有所有类成员的完整定义 我的功能incomplete 与一些演示程序一起看起来如下 include
  • 从服务到控制器的 $http 数据

    我正在寻找一种将请求的数据从我的服务传输到控制器的方法 简单的返回数据不起作用 我想知道为什么 test factory DataService function http log return getEmployees function
  • 如何在 T-SQL 存储过程中使用可选参数?

    我正在创建一个存储过程来搜索表 我有许多不同的搜索字段 所有这些字段都是可选的 有没有办法创建一个存储过程来处理这个问题 假设我有一个包含四个字段的表 ID FirstName LastName 和 Title 我可以做这样的事情 CREA
  • 使用 Firebug Lite 测试 IE6

    我使用 IEtester 在 IE6 中进行测试 因为客户端希望在其中看到页面 直到几周前 我还可以在 IETester 上使用 IE6 中的 firebug lite Stable Channel 尽可能地工作 现在我不能了 我不知道发生
  • IntentService 正在冻结我的应用程序 UI

    在我的应用程序中 我使用 Intentservice 从服务器获取数据并将获取的数据存储到本地 sqlite 数据库中 我正在使用 5 IntentService 来获取并填充五个表 每个 Intent Service 的数据最多可达 30
  • 我可以在 Apple Wallet 中访问哪些通行证

    我是 iOS 开发新手 想使用 PassKit 库开发一个小项目 经过大量搜索 Apple 文档 stackoverflow 后 我似乎无法清楚地理解我的问题的可能答案 是否可以访问不是我创建的通行证 现在 我不是在谈论与支付相关的通行证
  • 有没有办法统计执行的IL指令的数量?

    我想对 C 进程进行一些基准测试 但我不想使用时间作为向量 我想计算在特定方法调用中执行的 IL 指令的数量 这可能吗 Edit我并不是指方法体的静态分析 我指的是执行的实际指令数 因此 例如 如果方法体包含循环 则计数将增加 无论指令的数
  • docx 牢不可破的单词

    我正在尝试替换 docx 文件中的单词 如所述here public static void SearchAndReplace string document using WordprocessingDocument wordDoc Wor
  • 在数组上使用 .slice 方法

    我正在练习 JavaScript Koan 的数组部分 但我不完全理解为什么这些答案是正确的 如果有人可以澄清 让我知道我是否错了 我在下面添加了我的假设 it should slice arrays function var array
  • 单元测试-如何在flutter中模拟第三方库类Dio的参数

    我正在尝试测试一个简单的存储库类 该类使用依赖注入的 Dio 包进行网络调用 Http post 的要求是将 Map 对象发送到带有以下标头的 URL Content Type application json 您可以在下面看到这一点 cl
  • BeautifulSoup Div 类返回空

    我检查了类似的问题 但找不到解决方案 我正在尝试从以下页面中获取额外旅行时间的分钟数 46 https www tomtom com en gb trafficindex city istanbul 我尝试了两种方法 Xpath 和 fin
  • 划分两个 pandas DataFrame 并保留非数字列

    我有两个包含数字和非数字值的 pandas DataFrame 我想将一个除以另一个 但保留非数字列 这是一个 MWE a pd DataFrame group1 1 2 group1 3 4 group1 5 6 columns Grou
  • 无法使用 im.getcolors

    我正在尝试这段代码 im Image open myimage colors im getcolors print colors 它返回 无 所以我尝试了这个 im Image open myimage size im size color
  • 获取Scala3宏中的类型信息

    我正在努力获取 Scala3 宏实现中的类型信息 我将通过代码来解释问题 应用逻辑如下 object BlockServiceImpl extends BlockService def authenticateUser0 new Servi