gpt4 book ai didi

kotlin - Kotlin [1..n]构造函数参数

转载 作者:行者123 更新时间:2023-12-02 12:55:56 25 4
gpt4 key购买 nike

有没有一种方法可以在Kotlin中强制执行1 .. *参数,但仍允许散布运算符?
我试过了:

class Permission(
// 1..n compliance
accessiblePage: Webpage,
vararg accessiblePages: Webpage
) {
确实执行了1 .. *,但这也意味着 Permission(*pages)无法正常工作,因此这是一个非常尴尬的界面。
有没有一种简单的方法来执行1 .. *而不会出现运行时构造函数错误?

最佳答案

不幸的是,除了您提到的方式外,在编译时还没有办法在Kotlin中对此进行检查。由于vararg参数实际上只是数组的语法糖,因此您的代码本质上是

class Permission (
accessiblePage: Webpage,
accessiblePages: Array<Webpage>
)
因此问题就变成了“您可以确保在编译时一个数组中至少包含一个元素吗?”对于大多数语言,这显然不是,尽管Kotlin团队曾在一点上进行过实验:

[C]urrently, Kotlin compiler doesn't collect static information aboutcollections size. FYI, at some point Kotlin team tried to collect suchinformation and use it for warnings about possibleIndexOutOfBoundException and stuff like that, but it was found thatthere were a very little demand on such diagnostics in real-lifeprojects, so, given complexity of such analysis, it was abandoned[.](https://github.com/Kotlin/KEEP/issues/139#issuecomment-405551324)


可能会在某个时候添加此元数据,但是您不应该期望很快。
也就是说,对于Array,您总是可以将运行时检查与varargs的签名重载结合在一起。这意味着您的vararg示例将以相同的方式工作,但是将数组传递给函数将对其进行运行时检查(您也不必再使用spread运算符):
class Permission (
accessiblePage: Webpage
vararg accessiblePages: Webpage
) {
constructor(accessiblePages: Array<Webpage>) {
require(accessiblePages.isNotEmpty()) {
"Must have at least one accessible page."
}
}
}
叫像
val permission1 = Permission(Webpage(), Webpage())
val permission2 = Permission() // Would fail at compile time

val pages = arrayOf()
val permission3 = Permission(pages) // Would fail at runtime. Note also the lack of the spread operator.

关于kotlin - Kotlin [1..n]构造函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63318839/

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