在Scala类定义的开头,=>是什么意思?

12 浏览
0 Comments

在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日
0
0 Comments

这确实是自类型注释。请参阅官方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节中找到它。但是,请记住书籍可能很快过时,因此您需要参考规范。

0
0 Comments

类本身的默认命名是 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}
}

0