问题
交换类型参数与抽象类型=>
的作者在他的类定义的开头写了一个。例子:
abstract class Thing { t =>
type A
type G <: Group { type A = t.A }
val group: G
}
什么t =>
意思?
因为这在 Google & Co 中很难找到,有人可以给我更多的背景信息或提供一个链接,我可以在哪里找到关于这种语言结构的更多信息?
问题
交换类型参数与抽象类型=>
的作者在他的类定义的开头写了一个。例子:
abstract class Thing { t =>
type A
type G <: Group { type A = t.A }
val group: G
}
什么t =>
意思?
因为这在 Google & Co 中很难找到,有人可以给我更多的背景信息或提供一个链接,我可以在哪里找到关于这种语言结构的更多信息?
类本身的默认命名是this
. 您可以将其替换t
为t =>
如果您的类包含子类并且您需要访问封闭的自引用,这将很有用。
如果没有t =>
您的示例,您将编写如下内容:
abstract class Thing {
type G <: Group { type A = this.A }
}
Group { type A = this.A }
是一个子类型,因此this
将引用组专业化本身而不是事物对象。可能你得到的不是你想要得到的。如果您需要访问事物自引用,您应该通过为自引用分配另一个名称来解决名称冲突
abstract class Thing { another_this = >
type G <: Group { type A = another_this.A}
}
它确实是自类型注释。请参阅官方 Scala 规范:
https://scala-lang.org/files/archive/spec/2.13/13-syntax-summary.html
根据这个规范,它的上下文无关 EBNF 语法是:
SelfType ::= id [':' 类型] '=>' | 'this' ':' Type '=>' 所以,基本上,这意味着 SelfType 有两种基本形式。在一种形式中,您可以使用带或不带 Type 的 id。另一方面,您可以使用它,但它必须带有类型。
您可以在 Scala 第二版编程的第 29.4 节中找到它。但是,请记住,书籍很快就会过时,因此您需要参考规范。