【问题标题】:How to understand a fun with = in Kotlin?如何在 Kotlin 中理解 = 的乐趣?
【发布时间】:2019-09-11 03:48:41
【问题描述】:

我知道一个标准的乐趣,就像代码 0。

代码1是网页的示例代码,我无法完全理解

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

为什么要添加符号 = 来增加乐趣?并且是 fun 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)
}

【问题讨论】:

标签: kotlin


【解决方案1】:

块体

考虑这个函数:

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

行为在块体中定义。它有一个显式的返回类型 (Int) 和一个显式的 return 语句。 此处两者都是必需的。如果您没有明确指定返回类型,默认情况下它将为 Unit,并且由于推断的 a + b 类型为 Int,因此无法编译。

表达式主体

如果你这样写

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

您不需要指定返回类型,因为它可以从表达式中推断出来。您也不需要 return 语句,因为返回了最后一个表达式。 = 符号后面的内容称为表达式主体

所以,这两个函数做同样的事情。第二个只是写得更简洁。


注意

一个常见的错误是像这样同时使用它们:

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

如果您明确指定返回的类型,这将变得很清楚:

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

您实际上会返回一个 () -&gt; Int 类型的 lambda,这肯定不是您想要的。

【讨论】:

    【解决方案2】:

    function 在 kotlin 中通常具有以下形式:

    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
    

    所以这没什么特别的,只是函数声明的较短版本。

    【讨论】:

    • 谢谢,你的意思是“fun doubleTheValue(number: Int) { return number * 2 }”在Kotlin中可以吗?
    • @HelloCW 不,不是。请看我的回答!此处必须有明确的返回类型
    • @guenther 在您的第三个示例中:类型应为 Unit 除非您明确指定它
    • 当然不是。复制粘贴。如果返回类型为 Unit,则可以省略
    【解决方案3】:

    定义函数的传统方式就像你在代码0中写的那样,它由函数名、参数、返回类型和块体组成。在 Kotlin 中,函数可以用表达式体来定义,返回类型可以从表达式体中推断出来。

    假设有一个函数以传统方式将Boolean 转换为Int

    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 返回。

    【讨论】:

      猜你喜欢
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2018-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      • 2019-05-20
      • 2020-01-04
      相关资源
      最近更新 更多