【问题标题】:kotlin - how to reuse value of one parameter in another parameterkotlin - 如何在另一个参数中重用一个参数的值
【发布时间】:2020-10-01 00:45:08
【问题描述】:

我已经创建了一个对象,但是对于其中一个参数,创建过程很复杂。创建它后,我想将相同的值用于另一个参数。让我简单地给你举个例子:

MyModel(convenienceFee = raw.data?.fee,
           data = raw.data?.order?.map {/*complex operation that returns a list*/} ?: emptyList(),
            summary = createSummaryFrom(data), //compiler wont allow me using data here
            )

createSummaryFrom 无关紧要,它只需要一个列表并对其进行一些操作。

但问题是我无法在最后一行使用“数据”。它说它是一个未解决的领域。如何在另一个参数中使用已声明参数的值?

显然我可以将调用移到声明之外,但想知道为什么我可以在声明的同时在内部进行。

【问题讨论】:

  • 有什么理由不能使用变量吗?这里data只是一个参数名,所以不能用,只是给程序员的一个提示。
  • 是的,我可以使用变量,实际上我想知道是否有一些我不知道的捷径来完成这项工作。
  • 否,除非您将函数签名更改为使summary 参数的默认值等于createSummaryFrom(data)

标签: kotlin


【解决方案1】:

.run.let 作用域函数可用于实现类似的功能,但禁止引用另一个参数名称。我应该注意,这段代码也可以通过典型的变量使用来实现,但是从语法上讲,.let 更符合您的需求。

val model: MyModel = raw.data.let { rawData ->
    (rawData?.order?.map { ... } ?: emptyList()).let { transformedData ->
        MyModel(
            convenienceFee = rawData?.fee,
            data = transformedData,
            summary = createSummaryFrom(transformedData)
        )
    }
}

如果您愿意,可以阅读 Kotlin 的五个作用域函数here

根据有关可读性的有效反馈进行编辑:

应适当使用范围函数。在这个问题的范围之外,我更喜欢以下内容:

val rawData = raw.data
val transformedData = rawData?.order?.map { ... } ?: emptyList()

val model = MyModel(
    convenienceFee = rawData?.fee,
    data = transformedData,
    summary = createSummaryFrom(transformedData)
)

【讨论】:

  • 老实说,我使用 Kotlin 已经很多年了,但我发现这对于只用 2 个变量就可以完成的事情来说相当复杂。在使用作用域函数时,我们真的应该注意可读性。
  • 我同意;这是不可读的。我根据提问者的愿望定制了答案,并明确指出这也可以通过典型的变量使用来实现。
  • 我认为我的回答是恰当的,因为提问者的基本关注点是变量范围,因此我提供了一个解决该主题的示例并引用了相应的文档。
【解决方案2】:

重用值的最简单方法是显而易见的:使用局部变量。但我想你知道这一点。

另一种选择是将summary 的计算定义为它的默认值,在MyModel 类的声明站点。在那里,允许使用参数data的值:

class MyModel(
    val convenienceFee: Double,
    val data: DataType,
    val summary: Summary = createSummaryFrom(data),
)

那么当你实际实例化你的类时,你不需要提供summary

MyModel(
    convenienceFee = raw.data?.fee,
    data = raw.data?.order?.map {/*complex operation that returns a list*/} ?: emptyList()
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    相关资源
    最近更新 更多