gpt4 book ai didi

Kotlin 使用 lambda 作为初始化器

转载 作者:行者123 更新时间:2023-12-04 21:46:33 25 4
gpt4 key购买 nike

所以我有以下困境。这不是关于什么不起作用的问题,而是关于什么会更优雅/更好的做法以及为什么。

所以,我们知道 init block ,其中包含初始化逻辑。也许你打开了一个文件或从配置文件中读取了一些常量,也许你根据一些使用构造函数参数的更复杂的算法设置了一些属性。

但是,如果您的一个/某些属性确实需要一点逻辑,一些微不足道的逻辑,例如验证一个参数或类似的东西,该怎么办。而且这个逻辑只与那个特定的属性相关,与其他属性没有交互?

例如:

class MyCircularQueue(k: Int) {

private val arr = {
if (k < 1)
throw IllegalArgumentException("k must be at least 1")
else
Array(k) { 0 }
}()

private var head = 0
private var tail = 0
private var empty = true

}

这里arr需要初始化为0的数组,但是k小于1显然有问题。需要一个非常短的初始化逻辑,只是一个抛出异常或初始化数组的简单检查。没有与其他属性的交互,没有复杂的逻辑,只有极其微不足道的检查或逻辑。

在这种情况下,我想知道将琐碎的初始化逻辑放在“临时”代码块(现场调用的 lambda)中是否会更好。好处是声明和初始化逻辑将在同一个地方,而不是不必要地分开,我认为这样它更具可读性。

所以在我写完这篇文章之后,我想知道是否还有其他人因为非常简单的初始化逻辑而遇到这个问题,但我真的找不到任何相关信息。

所以底线是:这样可以吗?是好的做法,还是至少不是坏的做法?是否有意义?在 Kotlin 中是否有更好和/或官方的方式来做到这一点?

最佳答案

函数workaround不是必须的,if是一个表达式,返回一个值,所以可以简化:

private val arr =
if (k < 1)
throw IllegalArgumentException("k must be at least 1")
else
Array(k) { 0 }

或者,Kotlin 在标准库中提供了很多函数式 API,可以帮助创建简洁的单行代码。在这种情况下,您可以:

private val arr =
k.takeIf { it > 0 }?.let { Array(k) { 0 } } ?: throw IllegalArgumentException("k must be at least 1")

关于Kotlin 使用 lambda 作为初始化器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56474358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com