scala 是否為類提供默認的應用方法?
我有一堂課:
class Player(tea: String, sal: Int = 0) {
val team = tea
private val salary = sal
}
所以這里沒有 apply 方法,我也沒有為它定義任何伴生物件,所以也沒有 apply 方法。
但我能夠做到:
val player = Player("AAAA", 1000)
由于沒有使用“新”運算子,我知道這行代碼必須呼叫一些應用方法。但是我沒有定義。那么它是怎樣作業的?
uj5u.com熱心網友回復:
是的,從 Scala 3 開始,如檔案中所述:
Scala案例類生成apply方法,因此可以使用簡單的函式應用程式創建案例類的值,而無需撰寫
new.
Scala 3 將此方案推廣到所有具體類。例子:
class StringBuilder(s: String):
def this() = this("")
StringBuilder("abc") // old: new StringBuilder("abc")
StringBuilder() // old: new StringBuilder()
這是有效的,因為具有兩個應用方法的伴隨物件是與類一起生成的。該物件如下所示:
object StringBuilder:
inline def apply(s: String): StringBuilder = new StringBuilder(s)
inline def apply(): StringBuilder = new StringBuilder()
合成物件 StringBuilder 及其應用方法稱為建構式代理。甚至對于 Java 類和來自 Scala 2 的類也會生成建構式代理。具體規則如下:
object C為具體類創建建構式代理伴隨物件C,前提是該類還沒有伴隨物件,并且在C定義的范圍內也沒有定義或繼承的其他值或方法C。- 為提供的具體類生成建構式代理
apply方法
- 該類有一個伴生物件(可能已在步驟 1 中生成),并且
- 該伴隨物件尚未定義名為 的成員
apply。
每個生成
apply的方法都轉發給該類的一個建構式。它具有與建構式相同的型別和值引數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/508585.html
標籤:斯卡拉
上一篇:Spark-scala:將資料幀轉換為mllib矩陣
下一篇:HTML怎么設定圖片大小
