Scala 之旅

自类型

语言

自类型是一种声明特性必须混合到另一个特性中的方式,即使它没有直接扩展它。这使得依赖项的成员在没有导入的情况下可用。

自类型是一种缩小 this 或别名为 this 的另一个标识符的类型的方式。语法看起来像普通函数语法,但表示完全不同的含义。

要在特性中使用自类型,请编写一个标识符、要混合的另一个特性的类型和 =>(例如 someIdentifier: SomeOtherTrait =>)。

trait User {
  def username: String
}

trait Tweeter {
  this: User =>  // reassign this
  def tweet(tweetText: String) = println(s"$username: $tweetText")
}

class VerifiedTweeter(val username_ : String) extends Tweeter with User {  // We mixin User because Tweeter required it
  def username = s"real $username_"
}

val realBeyoncé = new VerifiedTweeter("Beyoncé")
realBeyoncé.tweet("Just spilled my glass of lemonade")  // prints "real Beyoncé: Just spilled my glass of lemonade"

因为我们在 trait Tweeter 中声明了 this: User =>,所以现在变量 username 对于 tweet 方法来说是作用域内的。这也意味着,由于 VerifiedTweeter 扩展了 Tweeter,所以它还必须混合 User(使用 with User)。

trait User:
  def username: String

trait Tweeter:
  this: User =>  // reassign this
  def tweet(tweetText: String) = println(s"$username: $tweetText")

class VerifiedTweeter(val username_ : String) extends Tweeter, User:  // We mixin User because Tweeter required it
  def username = s"real $username_"

val realBeyoncé = VerifiedTweeter("Beyoncé")
realBeyoncé.tweet("Just spilled my glass of lemonade")  // prints "real Beyoncé: Just spilled my glass of lemonade"

因为我们在 trait Tweeter 中声明了 this: User =>,所以现在变量 username 对于 tweet 方法来说是作用域内的。这也意味着,由于 VerifiedTweeter 扩展了 Tweeter,所以它还必须混合 User(使用 , User)。

此页面贡献者