【问题标题】:How to initialize a var in a lambda如何在 lambda 中初始化 var
【发布时间】:2017-01-31 20:04:59
【问题描述】:

我经常遇到这样的情况:

    var allData: List<ResponseData>

    FileInputStream(dataPath).use { input ->
        // allData is initialized here
        allData = ResponseData.parse(input)
    }

    // Kotlin can't tell that allData was initialized
    useAllData(allData)

我认为,问题在于 Kotlin 不知道传递给 use 的 lambda 何时会被调用,因此它无法知道在您到达 useAllData 时变量是否已初始化。我怀疑这只是一个没有好的解决方法的限制,但我希望有人有一种优雅的方式来初始化这些块中的东西(例如usewith 等)

【问题讨论】:

  • 顺便说一句,我知道我可以在声明中执行类似var allData: List&lt;ResponseData&gt;? = null 的操作,然后将useAllData 调用更改为useAllData(allData!!)。这行得通,但并不真正符合我对“优雅”的定义。

标签: kotlin


【解决方案1】:

Kotlin 的 use 返回结果,您可以将其直接分配给变量以避免此类问题。例如:

var allData: List<ResponseData> = FileInputStream(dataPath).use { input ->
    // allData is initialized here
    ResponseData.parse(input)
}

// Kotlin can now tell that allData was initialized
useAllData(allData)

【讨论】:

    猜你喜欢
    • 2017-06-12
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    相关资源
    最近更新 更多