2017-09-29 44 views
2

我知道一個標準的樂趣就像代碼0如何理解Kotlin中的樂趣?

守則1是從網頁中的示例代碼,我無法理解完全

fun convertFromDomain(forecast: ForecastList) = with(forecast) {...} 

爲什麼符號=加入好玩嗎?並且是有趣的convertFromDomain單元的返回值?

代碼0

fun My(forecast: ForecastList):Boolean { 
    ... 
    return true; 
} 

代碼1

data class ForecastList(val id: Long, val city: String, val country: String, val dailyForecast: List<Forecast>) { 

    val size: Int 
     get() = dailyForecast.size 

    operator fun get(position: Int) = dailyForecast[position] 
} 

data class Forecast(val id: Long, val date: Long, val description: String, val high: Int, val low: Int, 
        val iconUrl: String) 



fun convertFromDomain(forecast: ForecastList) = with(forecast) { 
    val daily = dailyForecast.map { convertDayFromDomain(id, it) } 
    CityForecast(id, city, country, daily) 
} 
+1

https://kotlinlang.org/docs/reference/basic-syntax.html#defining-functions,https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/with.html –

回答

7

塊體

考慮這樣的功能:

fun sum(a: Int, b: Int): Int { 
    return a + b 
} 

的行爲在塊體定義。它有一個明確的返回類型(Int)和一個明確的return語句。 這兩個在這裏是強制性的。如果不明確指定返回類型,則默認情況下它將爲Unit,並且由於a + b的推斷類型爲Int,因此它將不會編譯。

表達身體

如果你把它寫這樣

fun sum(a: Int, b: Int) = a + b 

你不需要指定返回類型,因爲它可以從expression.You推斷不需要返回語句,因爲最後一個表達式被返回。 =符號後面的內容稱爲表達式主體

所以,兩個功能都做同樣的事情。第二個只寫得更簡潔。


注意

一個常見的錯誤是在一次使用這兩個這樣的:

fun sum(a: Int, b: Int) = { a + b } 

這是什麼會做變得清晰,如果你明確的寫返回類型:

fun sum(a: Int, b: Int): (Unit) -> Unit = { a + b } 

你實際上會返回一隻羊da,這當然不是你想要的。

4

一個function,通常已在科特林以下形式:

fun name([parameters])[: return_type] { 
    // function-body 
} 

e.g. 
fun doubleTheValue(number: Int): Int { 
    return number * 2 
} 

如果你的函數體只是一個單一的表達,你可以使用函數聲明

fun name([parameters])[: return_type] = [expression] 

e.g. 
fun doubleTheValue(number: Int): Int = nummber * 2 
fun doubleTheValue(number: Int) = nummber * 2 // type can also be inferred 

的一個較短的版本所以這沒什麼特別的,只是一個較短的版本的函數聲明。

+0

謝謝,do你的意思是「fun doubleTheValue(number:Int){return number * 2 }」在Kotlin中可以嗎? – HelloCW

+0

@HelloCW不,它不是。請看我的答案!一個明確的返回類型在這裏是強制性的 –

+0

@guenther在你的第三個例子中:類型預期爲單元unlesse,你明確地指定它 –

0

定義函數的傳統方法就像你在代碼0中寫的那樣,它由函數名,參數,返回類型和塊體組成。在Kotlin中,函數可以用表達式體定義,返回類型可以從表達式體中推斷出來。

假設有其轉換BooleanInt,在傳統方式的函數:

fun Boolean.toInt(): Int { 
    return if (this) 1 else 0 
} 

它可以簡化爲:

fun Boolean.toInt() = if (this) 1 else 0 

在返回類型推斷爲Int因爲10都是Int,它們將從表達式if (this) 1 else 0返回。