自類型是一種宣告特質必須混合到另一個特質中的方式,即使它並未直接延伸它。這讓相依項的成員在沒有導入的情況下可用。
自類型是一種縮小 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
)。