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