从内部`with`函数引用到更高级别的`with`函数

时间:2018-10-17 19:01:51

标签: kotlin

在我的代码中,我有一个像这样的结构

post { req ->
    with(req.objectBody<Person>()) {
        logger.info { "Attempt to save person $this" }
        with(require<SessionFactory>().openSession()) {
            save(this@with)
        }
    }
}

但是IDE警告我there is more than one label with such a name。在这种情况下

save(this@with)

我想引用with(req.objectBody<Person>)实例。如何实现?

1 个答案:

答案 0 :(得分:6)

从技术上讲,您可以使用自定义标签标记lambda,然后将这些标签与标签一起使用。例如:

with(foo()) mylabel@{
    with(bar()) {
        baz(this@mylabel)
    }
}

但是,为了提高可读性,可以使用with范围函数并为参数提供名称,而不是let

foo().let { fooResult ->
    bar().let { barResult ->
        baz(fooResult)
    }
}