获取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宏中的类型信息 的相关文章

随机推荐

  • 与 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