微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

执行顺序-Kotlin

如何解决执行顺序-Kotlin

我试图调试下一个程序以了解执行顺序,但是我仍然对执行顺序感到困惑

fun foo(): String{
    println("Calculating foo...")
    return "foo"
}

fun main(args: Array<String>) {
    println("First ${foo()},Second ${foo()}!")
}
// Result:
//
// Calculating foo...
// Calculating foo...
// First foo,Second foo!

// I though the execution would show something like this:
//
// First Calculating foo...foo,// Second Calculating foo...foo!

不是主要要执行的初始功能吗? 如果是,那么 println 将是第一句话,因此(对我来说)执行将从左到右开始(我正确吗?),所以...如果它是第一个单词要显示的是First,然后将其称为 foo()函数,这将返回“ foo” ,将再次推断为字符串=> $ {} ...对吗? 如果没有,那我会误会什么?

感谢您的澄清。

解决方法

这里有两个概念:

  1. 字符串插值将采用函数的输出来构建输出文本。 foo()中的println调用是一个副作用,不包含在返回值中。因此,不会将其添加到生成的字符串中。
  2. main函数中的
  3. println将接收字符串插值的结果。文本在传递给println之前会被完全解释。这就是为什么您看到的输出是这样的:要创建最终文本,kt将首先执行每个字符串表达式,然后构建整个字符串以显示,最后将准备好的文本传递给println函数。

代码执行顺序与自然读取顺序没有严格的约束。有运算符优先级的概念,在执行函数时,必须先评估其所有参数,然后再将其传递给函数(闭包/ lambda除外,但这是一个更复杂的主题)。还有更多的规则。我只能鼓励您参加一门一般的编程课程来发现所有这些内容,因为有很多话要说,将所有内容都包含在一个SO答案中很难。

,

Kotlin's String templates是静态解析的,并与字符串串联转换为相应的变量/函数调用。

"test ${foo()} test2"这样的文字将在JVM字节码中编译为"test " + foo() + "test2"


基本上是您的函数调用,

println("First ${foo()},Second ${foo()}!")

像这样被切碎

println("First " + foo() + ",Second " + foo() + "!")

这将执行如下:

println(  "First ".plus(foo()).plus(",Second ").plus(foo()).plus("!")  )

因此,首先,在所有String串联之后都进行了foo调用,同样,以上述方式,最终String作为参数发送到println()

,

您可以这样考虑

  1. 执行main()函数。
  2. 计算println()函数的参数。
    • "First ${foo()},Second ${foo()}!"使用的是字符串插值,因此我们需要首先对字符串进行插值。
  3. 通过调用foo()首先插值${foo()}
  4. 第一个foo()打印"Calculating foo..."
  5. 通过调用foo()来内插第二个${foo()}
  6. 第一个foo()打印"Calculating foo..."
    • 现在我们有了插值字符串First foo,Second foo!
  7. 执行println("First foo,Second foo!")

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。