今天要介紹一些平常很常見,但你不一定知道他背後原理的一些Kotlin方法或元件,包括Any類別、資料類別、具名引數及多載函式。
我們日常使用的"=="幕後就是執行equals函式
val w1 = Wolf()
val w2 = Wolf()
println(w1.equals(w2))
//因為w1與w2引用不同的物件,所以印出false
此函式回傳物件的雜湊碼。雜湊碼通常被用來儲存與取出資料結構的值。
可以把雜湊碼想成桶子上的標籤,系統會把相等的物件放入同一個桶子,之後用雜湊碼來尋找他們。雜湊碼是一種用來縮小搜尋範圍的機制,雜湊碼相同的物件不一定是相等的,但相等的物件一定有相同的雜湊碼。
val w = Wolf()
println(w.hashCode())
//印出523429237
此函式回傳代表物件的String訊息,包含一個名稱及一串數字。
val w = Wolf()
println(w.toString())
//印出Wolf@1f32e575
建立一個data class
data class Recipe(val title:String,
val isVegetarian:Boolean)
覆寫後的equals函式,會讓r1==r2是true
val r1 = Recipe("Chicken wings",false)
val r2 = Rwcipe("Chicken wings",false)
它的equals函式,將判斷依據改成根據物件屬性值來判斷物件是否相等,所以此時r1==r2是true,因為它們保存的是相同的資料。而既然兩個物件相等,他們就會有相同的hashCode。
覆寫後的toString函式,會清楚回傳各屬性的值。
val r1 = Recipe("Chicken wings",false)
println(r1.toString())
//印出Recipe(title=Chicken wings,isVegetarian=false)
val r1 = Recipe("thai curry",false)
val r2 = r1.copy(isVegetarian = true)
複製r1物件,並把素食屬性改為true。此作法能建立物件的新副本,並保持原物件不變。
val dataR = Recipe("Chicken wings",false)
val t = r.component1()
r.componentN()
可以取得r的第N個屬性值。雖然其實功能與val t = r.title
一樣,但是component比較泛用,它可以很容易地解構資料。例如:
你不需要這樣一個一個取出每個屬性
val t = dataR.title
val v = dataR.isVegetarian
只要這樣即可val (t,v) = dataR
意思就是,將dataR的第一個屬性指派給變數t,第二個屬性指派給變數v,也就是傳說中的解構。
BTW, " === " 運算子絕對可以檢查兩個變數是否引用同一個物件,不像"=="會被data class或是其他類別所覆寫掉。
data class Recipe(val title:String,
val mainIngredient:String,
val is vegetarian:Boolean = false,
val difficulty:String = "Easy")
你可以一如往常呼叫它,依序傳值(可以不用傳值給已經有預設值的引數)。
`val r = Recipe("Spaghetti","beef")`
也可以使用具名引數來明確指出哪個屬性使用哪個值,而且不用依照順序傳值!!!!
val r = Recipe(mainIngredient = "Beef",
title = "Spaghetti")
具名引數也可以用在函式裡面哦
fun findRecipe(val title:String = "",
val mainIngredient:String = "",
val is vegetarian:Boolean = false,
val difficulty:String = ""):Array<Recipe>{
}
//使用具名引數,沒指定的引數就用預設值
val r = findRecipe(title = "Thai curry")
fun addNumbers(a:Int,b:Int):Int{
return a+b
}
fun addNumbers(a:Double,b:Double):Double{
return a+b
}
當你用addNumbers(2,5)
呼叫函式時,系統會呼叫Int版本的函式。
當你用addNumbers(1.6,2.8)
呼叫函式時,系統會呼叫Double版本的函式。