gpt4 book ai didi

以 Vararg 作为第一个参数的 Kotlin 方法

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

注意我已经查看了以下问题/答案来解决问题,但没有任何运气。 Call Java Varargs Method from Kotlin - 这个在参数列表的末尾有可变参数参数,但我的问题涉及参数列表开头的可变参数。 Kotlin: Convert List to Java Varargs - 相同。其他搜索也得到同样的结果。这些是我能找到的最接近的。

我正在使用单个字符分隔符调用 Kotlin String.split 方法。 这是一个 vararg 方法,其中 vararg 参数是多个参数中的第一个。该方法的定义如下:

public fun CharSequence.split(vararg delimiters: Char, 
ignoreCase: Boolean = false,
limit: Int = 0): List<String>

当我调用如下方法时,它可以正常编译:

fun String.splitRuleSymbol() : String = this.split(':') //ok

但是当我尝试添加 ignoreCaselimit 参数时,我遇到了问题:

fun String.splitRuleSymbol() : String = this.split(':', true, 2) //compiler error

我得到的错误是...

None of the following functions can be called with the arguments supplied:

public fun CharSequence.split(vararg delimiters: String, ignoreCase: Boolean = ..., limit: Int = ...): List defined in kotlin.text

public fun CharSequence.split(vararg delimiters: Char, ignoreCase: Boolean = ..., limit: Int = ...): List defined in kotlin.text

对我来说,有一个 vararg 参数后跟其他参数有点奇怪,但这不是重点。如果我按如下方式调用它,它就可以正常工作:

 // both of the following compile
fun String.splitRuleSymbol() : String =
this.split(delimiters = ':', ignoreCase = true, limit = 2)
fun String.splitRuleSymbol2() : String =
this.split(';', ignoreCase = true, limit = 2)

有没有办法将 vararg Char 传递到此方法,而不必使用参数名称 ignoreCaselimit 限定我的其他两个参数编译器不能判断其余参数不是Char吗?

我已经尝试过the spread operator以及下面的其他一些方法,但都不起作用:

    //compiler errors on all these
this.split(*':', true, 2) //using the "spread" operator
this.split(*charArrayOf(':'), true, 2)
this.split(*mutableListOf(':'), true, 2)
this.split(*Array<Char>(1) { ':' }, true, 2)

是的,我知道其中一些看起来很荒谬。但是,有没有办法避免冗长的替代方案呢?

PS当我提出问题时,我发现了另一个可以编译的表达式。

    this.split(':', limit = 2)

这不太冗长,并且由于我不需要更改默认的 ignoreCase 参数,因此它更接近我正在寻找的内容。

最佳答案

您的观察是正确的。 vararg 参数后面的参数只能使用命名参数传入,否则会遇到歧义问题(举个简单的例子,假设所有参数都是 类型时)任何)。

我现在能找到的最好的来源是这个 book .

The vararg parameter is usually the last parameter, but it does not always have to be. If there are other parameters after vararg, then arguments must be passed in using named parameters

编辑:@Les 找到了一个很好的来源,请参阅 their answer .

关于以 Vararg 作为第一个参数的 Kotlin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46456213/

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