关于Ktor中Elvis运算符it指向外部作用域的技术疑问
关于Ktor中Elvis运算符
it作用域的问题 
这是Kotlin本身的语法规则,和Ktor无关:Elvis运算符(?:)的右侧表达式不会自动把左侧的可空值作为it,你看到的it是来自外层lambda的作用域参数(比如你路由处理函数里的call对象,也就是外层get { ... }里的it)。
举个实际的代码例子,假设你写了类似这样的代码:
get("/test") { // 这里的it是Call类型的对象 val nullableUser: User? = null val targetUser = nullableUser ?: it.attributes.get(UserKey) // 这里的it就是外层get lambda的参数,不是nullableUser }
之所以会这样,是因为Elvis右侧就是普通的表达式,不是lambda,没有隐式的参数传递。只有当你用let、run这类作用域函数时,才会把调用者作为it传入lambda。
如果想在Elvis右侧用到左侧的可空值,你要么直接写变量名,要么用作用域函数显式捕获:
// 直接用变量名 val targetUser = nullableUser ?: handleNullCase(nullableUser) // 用let显式捕获非空值,再处理空情况 val targetUser = nullableUser?.let { nonNullUser -> // 处理非空的nonNullUser } ?: handleNullCase()
内容的提问来源于stack exchange,提问作者Le Hoang Long
相关产品推荐
相关产品推荐

