【问题标题】:Is the Kotlin "if" keyword actually a function?Kotlin 的“if”关键字实际上是一个函数吗?
【发布时间】:2021-01-11 22:31:02
【问题描述】:

在 Kotlin 中,当您编写类似的东西时

if (true) {
  doStuff()
}

{} 实际上是一个 lambda 表达式,而不是一个块?因此,您可以将if 视为一个函数,该函数将 lambda 作为第二个参数,并在其第一个参数为真时执行它(伪代码):

fun if(checkIfThisIsTrue: Boolean?, runThisLambdaIfTheFirstArgIsTrue: (T) -> T)

让我想起 Ruby 没有算术,2 + 3 实际上是2.+(3) 的语法糖,其中+ 是名为2 的对象上的方法名称。 Kotlin 是否也以这种方式设计(例如 {} always 表示 lambda),还是 {} 不表示 lambda?

【问题讨论】:

  • 2+3 在 Kotlin 中确实是 2.plus(3),乘法、除法和减法也是如此。 a += 3 也是 a.plusAssign(3) 以及更多前面带有 operator 关键字的方法。但我很重要很确定 if 不是 lambda 接受函数。如果您在操作员/函数调用站点上执行Ctrl+leftclick,您可以看到这一点。

标签: kotlin


【解决方案1】:

它不是 lambda 表达式或函数。根据kotlin documentation

在 Kotlin 中,if 是一个表达式,即它返回一个值。

以及关于functional programming的文档:

请注意,Kotlin 中花括号的其他用途,例如在函数和类定义中以及 if/else/for/while 语句之后,不是 lambda 表达式(因此 if 不是有条件的函数执行一个 lambda 函数

grammar 中描述了 if 语句是如何构造并最终解释的:

ifExpression (used by primaryExpression)
  : 'if' '(' expression ')'
    (controlStructureBody | ';')
  | 'if' '(' expression ')'
    controlStructureBody? ';'? 'else' (controlStructureBody | ';')
  ;

【讨论】:

    【解决方案2】:

    这绝对不是一个函数。它由 Kotlin 编译器按词法处理。

    我不是 Kotlin 编译器方面的专家,但 this 似乎是 Java 实现。

    该表达式似乎在代码中由 KtIfExpression 在概念上表示。

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      • 2020-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多