首页 > 解决方案 > 尾随 lambda 的上下文

问题描述

您可以在下面看到尾随的 lambda 语法:

  runApplication</*... */>(/*... */) {
    setBannerMode(/*... */)
  }

我理解我们可以在括号外传递一个 lambda 作为最后一个参数的想法。但是上面的代码实际上做了什么?setBannerMode是一种将覆盖父类中的方法的方法,不是吗?如果是,父级是什么班级?this尾随 lambda 的大括号之间是否有一些上下文?一般来说,那里发生了什么?

代码来自这里

标签: springspring-bootkotlin

解决方案


setBannerMode 是一个被覆盖的方法,不是吗?

不,您正在做的是将 lambda 传递给runApplication()具有this 隐式接收器的。

是定义(Spring文档):

inline fun <reified T : Any> runApplication(vararg args: String, init: SpringApplication.() -> Unit): ConfigurableApplicationContext =
        SpringApplication(T::class.java).apply(init).run(*args)

init: SpringApplication.() -> Unit是带有隐式接收器的 lambda 的定义。这意味着在 lambda 内部,this将是一个SpringApplication.

分解它:

  1. SpringApplication(T::class.java)- 创建一个新的 spring 应用程序。T是由 Kotlin 编译器从调用上下文中计算出来的(这就是reified T意思)。
  2. apply(init). 调用您的 lambda ( init),并将SpringApplication用作接收者(适用于应用的 Kotlin 文档)。
  3. 使用 varargs 参数调用SpringApplication'srun()函数。此函数返回一个ConfigurableApplicationContext.

因此,您正在调用setBannerMode()实例化SpringApplication对象的方法。


推荐阅读