gpt4 book ai didi

Scala 类型投影 : pick an object within a path-dependent trait

转载 作者:行者123 更新时间:2023-12-01 12:31:06 25 4
gpt4 key购买 nike

我有一个声明多个模块的路径依赖特征。那也行。但是,我写了一个宏,我需要访问那些内部类型,但我无法编写一个正确的表达式来选择它们。

trait A {

type Foo

object module { // one of modules encapsulating functionality

class Bar // I use it as an annotation depending on Foo but that is irrelevant
}

class Other
}

现在我需要编写一个正确的类型表达式来选择 Bar 类来检索它的 weakTypeTag。我可以编写 weakTypeOf[ A#Other ] 来选择 Other 类。但是当我尝试选择 Bar 时,它不起作用。我试过:

  • A#module.Bar
  • A#module#Bar
  • A#module.type.Bar
  • A#module.type#Bar

所有这些都在 module 选择时失败。

为什么这些不起作用以及如何使它们起作用?谢谢。

最佳答案

moduleA 中的一个对象,(它依赖于 A 的实例),所以这个对象A 应反射(reflect)在其类型签名中:

scala> typeOf[a.module.type forSome { val a: A }]
res1: reflect.runtime.universe.Type = a.module.type forSome { val a: A }

你可以通过在特征 A 中创建别名 Inner 来看到这一点

trait A {
type Inner = module.type // it is actually this.module.type, where this refers to the instance of A
object module {
class Bar
}
}

现在我们可以检查这两种类型是否等价:

scala> typeOf[A#Inner]
res2: reflect.runtime.universe.Type = _8.module.type forSome { val _8: A }

scala> res1 =:= res2
res3: Boolean = true

最后,要访问最里面的 Bar,我们需要添加适当的投影:

scala> implicitly[(a.module.type forSome { val a: A })#Bar =:= A#Inner#Bar]
res4: =:=[a.module.Bar,_38.module.Bar] = <function1>

关于Scala 类型投影 : pick an object within a path-dependent trait,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34130251/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com