首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala3宏中获取类型信息

在Scala3宏中获取类型信息
EN

Stack Overflow用户
提问于 2021-05-06 16:52:57
回答 2查看 193关注 0票数 1

我很难获得Scala3宏实现中的类型信息。我会用代码来解释问题。

下面是应用程序逻辑:

代码语言:javascript
复制
object BlockServiceImpl extends BlockService:
  def authenticateUser0() = new ServiceCall[AuthUser,AuthUserResponse]:
     def invoke(request: AuthUser): Future[AuthUserResponse] = 
       println("BlockServiceImpl authenticateUser0 called")
       Future.successful(AuthUserResponse("test"))   

现在,对于逻辑,我想用宏来创建端点。

代码语言:javascript
复制
defineRoute("POST","/v1/block",BlockServiceImpl.authenticateUser0)

这是内联方法:

代码语言:javascript
复制
inline def defineRoute[Q: RootJsonFormat ,R: RootJsonFormat](method: String, uri: String,inline call: () =>  ServiceCall[Q,R]): AkkaHttpCall = ${ methodImpl[Q,R]('uri, 'call)}

这就是宏的实现:

代码语言:javascript
复制
def methodImpl[Q: Type,R: Type](uri: Expr[String],expr: Expr[Function0[ServiceCall[Q,R]]])(using ctx: Quotes): Expr[AkkaHttpCall] = ...

如何在编译时获得宏展开过程中QAuthUser类型的信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-11 10:34:14

如果Q和R是特例的话,我通过输入信息来解决这个问题(NotUsed,Done,..)在用于Q和R的序列化器中,这一思想取自于Lagom框架。

票数 0
EN

Stack Overflow用户

发布于 2021-05-07 10:03:36

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

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

代码语言:javascript
复制
def tag[A <: AnyKind] = throw new IllegalStateException("use it only to pattern match types")

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

代码语言:javascript
复制
'{ tag[Q] } match {
      case '{ tag[AuthUser] } => // here I am sure that Q is AuthUser, since Q is matched with AuthUser
}

这是一个相当大的窍门(而且不是很容易扩展,因为你必须添加每一种类型),所以把我说的每句话都拿出来.我认为这是一个更清晰的解决方案,取决于您特定的应用程序逻辑:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67422689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档