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