Kotlin 科特林:我可以使用封闭的合格返回吗?

Kotlin 科特林:我可以使用封闭的合格返回吗?,kotlin,closures,elvis-operator,Kotlin,Closures,Elvis Operator,我想记录并返回供应商提供的空值 如果不记录日志,这可以正常工作: fun check_plain(supplier: Supplier<String?>) { val arg: String = supplier.get() ?: return // do checking } fun check\u plain(供应商:供应商){ val arg:String=supplier.get()?:返回 //检查 } 但是,如果我也在e

我想记录并返回供应商提供的空值

如果不记录日志,这可以正常工作:

    fun check_plain(supplier: Supplier<String?>) {
        val arg: String = supplier.get() ?: return
        // do checking
    }
fun check\u plain(供应商:供应商){
val arg:String=supplier.get()?:返回
//检查
}
但是,如果我也在elvis后面登录,我会得到一个错误:

    fun check_log(supplier: Supplier<String?>) {
        val arg: String = supplier.get() ?: {
            logger.info { "Nothing interesting here" }
            return@check_log // 'return' is not allowed here
        }
        // do checking
    }
fun检查日志(供应商:供应商){
val arg:String=supplier.get()?:{
logger.info{“这里没什么有趣的”}
return@check_log此处不允许使用“//”返回
}
//检查
}
我解决了它,但它不是等价的,我失去了形式上的非空性:

    fun check_if(supplier: Supplier<String?>) {
        val arg: String? = supplier.get().also {
            if (it == null) {
                logger.info { "Nothing interesting here" }
                return@check_if
            }
        }
        // do checking
    }
fun检查(供应商:供应商){
val arg:String?=supplier.get(){
if(it==null){
logger.info{“这里没什么有趣的”}
return@check_if
}
}
//检查
}

我可以以某种方式保留Elvis吗?

return
不允许返回,因为lambda没有内联。有关详细信息,请参阅

对于这种简单的情况,您只需执行以下操作:

val arg: String = supplier.get() ?: return logger.info { "Nothing interesting here" }
如果要运行更多语句,请使用
run

val arg: String = supplier.get() ?: return run {
    logger.info { ... }
    logger.info { ... }
    logger.info { ... }
}
或:


请注意,允许在
run
中使用
return
,因为
run
是内联的。

return
是不允许的,因为lambda没有内联。有关详细信息,请参阅

对于这种简单的情况,您只需执行以下操作:

val arg: String = supplier.get() ?: return logger.info { "Nothing interesting here" }
如果要运行更多语句,请使用
run

val arg: String = supplier.get() ?: return run {
    logger.info { ... }
    logger.info { ... }
    logger.info { ... }
}
或:

请注意,
return
run
中是允许的,因为
run
是内联的