当前位置: 首页 > 知识库问答 >
问题:

柯特林聪明的施展在当表情上

幸乐湛
2023-03-14

我对科特林聪明的演员感到困惑。在我看来,如果(条件)/否则等价于当(条件)为真 -

我正在使用kotlin 1.5.30

data class Person(val name: String)
data class Address(val id: String, val person: Person?)

fun getPersonFromAddress(address: Address?): String {
    return if (address?.person != null) {
        address.person.name
    } else {
        "Not found"
    }
}

fun getPersonFromAddress(address: Address?): String {
    return when (address?.person != null) {
        true -> address.person.name // <-- Does not compile
        false -> "Not found"
    }
}

共有1个答案

范豪
2023-03-14
匿名用户

由于它分析它的方式,if 表达式将转换为如下所示的 when 表达式:

fun getPersonFromAddress(address: Address?): String {
    return when {
        address?.person != null -> address.person.name
        else -> "Not found"
    }
}

将编译。

带有参数的时的与没有参数的时的不同。首先评估参数中的表达式,仅一次。然后将结果(而不是表达式)与每个案例进行比较。因此,就如何评估它而言,它与if/ore相同是一个步骤。

正如注释中提到的@broot,您还可以将空检查推迟到像这样的时候,智能强制转换将起作用,因为它在该分支上检查它:

fun getPersonFromAddress(address: Address?): String {
    return when(address?.person) {
        null -> "Not found"
        else -> address.person.name
    }
}

如果您要将带有条件的 when 语句的尝试转换为 if/else 语法,它将如下所示:

fun getPersonFromAddress2(address: Address?): String {
    val condition = address?.person != null
    return if (condition) {
        address.person.name
    } else {
        "Not found"
    }
}

其也将不编译。

我认为这是因为在这些情况下,编译器必须对智能强制转换进行分析的复杂性会随着额外的间接检查而成倍增长。

 类似资料:
  • 我有这个代码: 其中是类型的参数 < code>var mMeshes: MutableList 编译器在最后一行抱怨,我试图在那里声明 智能投射到

  • 我正在尝试使用静态编程语言反射从类及其成员生成JFrames。我创建了几个注释,其中一些在运行时存在,一些不存在。 组件注释: 启用注释: 我是这样使用这两个注释的: 如果我运行下面的代码: 我得到的唯一输出是这样的:< code>btn: [Component] 由于Retention设置为

  • 我如何将下面的代码从Java转换成Kotlin?

  • 我正在使用蓝牙LE来获取周围的设备,但是我没有得到一个列表,而且我还得到一个运行时异常,这里是stack-trace 代码在这里 我不明白为什么data抛出null

  • 我在用Kotlinhttps://github.com/vojtechhabarta/typescript-generator为API中使用的类生成TypeScript定义。 为了保留可空性信息,类型脚本生成器可以使用字段和方法上存在的注释。它支持构建脚本中列出的任意注释类名。 出于某种原因,静态编程语言使用而不是JSR-305注释注释可空字段。 虽然JSR-305注解具有,但JetMind注解具

  • 我已经实现了一个函数,我过去常常传递给anko的应用程序递归。 在这个函数里面,我想添加一个边际结束是视图在一个LinearLayout里面,所以我写了下面的代码: 我收到错误,即视图.布局参数是一个可变属性,可以更改。所以我不得不强迫演员: 在这里看堆栈溢出,我看到 Kotlin 不会在可为空的变量中智能强制转换,但 view.layoutParams 不能为空,那么为什么智能强制转换无法推断出