[英]what does A#B mean in scala
我试图理解以下代码。 但我不知道R#X是什么意思。 有人可以帮我吗?
// define the abstract types and bounds
trait Recurse {
type Next <: Recurse
// this is the recursive function definition
type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
type Next = RecurseA
// this is the implementation
type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
// infinite loop
type C = RecurseA#X[RecurseA]
}
您可以从类的现有实例获取类型:
class C {
type someType = Int
}
val c = new C
type t = c.someType
或者可以在不实例化对象的情况下直接寻址该类型: C#someType
这种形式对于没有空间创建中间变量的类型表达式非常有用。
添加了一些评论中建议的澄清。
免责声明 :我对Scala的类型系统如何工作只有部分了解。 我曾尝试阅读过几次文档,但只能从中提取一些零碎的知识。 但是我在scala方面拥有丰富的经验,并且可以很好地预测编译器在个别情况下的行为。
#
称为类型投影和类型投影补充了通过进行普通的分层类型访问.
在每个类型表达式中,scala都隐式使用两者。
scala参考提供了此类不可见转换的示例:
t ə.type#t
Int scala.type#Int
scala.Int scala.type#Int
data.maintable.Node data.maintable.type#Node
如使用所见,类型投影的所有琐碎用法实际上都适用于类型(即以.type
返回),而不适用于对象。 主要的实际区别(我对定义不好)是对象类型就像对象本身一样短暂。 在诸如抽象类类型的继承之类的适当情况下,可以更改其类型。 对比类型的类型(类型投影的定义)与太阳一样稳定。 Scala中的类型(不要将它们与类混用)不是一等公民,并且不能被进一步覆盖。
有许多适合放置类型表达式的地方。 在某些地方,仅允许使用稳定类型。 因此,基本上,对于类型而言,类型投影更恒定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.