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

2024-03-31

Note我查看了以下问题/答案来解决问题,但没有任何运气。从 Kotlin 调用 Java Varargs 方法 https://stackoverflow.com/questions/36626152/call-java-varargs-method-from-kotlin- 这个在参数列表的末尾有可变参数参数,但我的问题涉及参数列表开头的可变参数。Kotlin:将列表转换为 Java 可变参数 https://stackoverflow.com/questions/45854994/kotlin-convert-list-to-java-varargs- 相同。其他搜索也得到同样的结果。这些是我能找到的最接近的。

我正在调用 KotlinString.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

但是当我尝试添加ignoreCase and limit参数,我遇到一个问题:

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

我得到的错误是...

不能使用提供的参数调用以下函数:

public fun CharSequence.split(vararg delimiters: String,ignoreCase: Boolean = ..., limit: Int = ...): kotlin.text 中定义的列表

public fun CharSequence.split(vararg delimiters: Char,ignoreCase: Boolean = ..., limit: Int = ...): 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进入此方法,而无需使用参数名称限定我的其他两个参数ignoreCase and limit?编译器能不能告诉我们剩下的参数不是Char?

我努力了扩展运算符 https://kotlinlang.org/docs/reference/java-interop.html#java-varargs以及下面的其他一些方法,但都不起作用:

    //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参数,它更接近我正在寻找的。


你的观察是正确的。 a 之后的参数vararg参数只能通过使用命名参数来传递,否则你会遇到歧义问题(举一个简单的例子,假设所有参数的类型都是Any).

我现在能找到的最好的来源是这个book https://www.packtpub.com/mapt/book/application_development/9781787126367/4/ch04lvl1sec59/varargs.

vararg 参数通常是最后一个参数,但并不总是必须如此。如果 vararg 后面还有其他参数,则必须使用命名参数传入参数

编辑:@Les 找到了一个很好的来源,请参阅他们的答案 https://stackoverflow.com/a/46460028/4465208.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以 Vararg 作为第一个参数的 Kotlin 方法 的相关文章

随机推荐

  • 如何重新加载 vue 组件?

    我知道解决方案是像这样更新道具数据 this selectedContinent 但我想使用另一种解决方案 在我阅读了一些参考资料后 解决方案是 this forceUpdate 我尝试了一下 但不起作用 演示和完整代码如下 https j
  • 向 Google 仪表添加 % 符号

    我正在使用 Google 仪表 并且想在仪表中的值后面添加一个 符号 我的值显示良好 没有百分比符号 整数 0 100 但是当我开始尝试添加百分比符号时 事情变得不稳定 这是我尝试过的 Format the data to include
  • iPhone CoreText:查找子字符串的像素坐标

    这是 Twitter 应用程序的屏幕截图供参考 http screencast com t YmFmYmI4M http screencast com t YmFmYmI4M 我想要做的是将浮动弹出窗口放置在可以跨越多行的 NSAttrib
  • 如何在 Puppeteer 中选择 iframe 元素内的元素

    由于 ESPN 不提供 API 因此我尝试使用 Puppeteer 来抓取有关我的 Fantasy Football League 的数据 但是 由于登录表单嵌套在 iframe 元素中 我很难尝试使用 puppeteer 登录 我已经去了
  • Next12 中带有 Prisma 适配器的 NextAuth 凭证提供程序不执行任何操作

    我已经设置了我的Nextjs Next12 with NextAuth 凭证提供者并使用棱镜适配器将用户会话保留在数据库中 我跟着这个文档 https next auth js org adapters prisma来自 NextAuth
  • 求解混合互补模型时出错

    直接使用 PATH 求解器 我无法解决下面提出的问题 最初的问题来源于https prod sandia gov techlib noauth access control cgi 2015 155584 pdf https prod sa
  • 以良好的质量和内存效率缩小资源中的位图

    我想缩小 500x500px 资源以始终适合由屏幕宽度确定的特定尺寸 目前我使用 Android 开发者网站 高效加载大位图 http developer android com training displaying bitmaps lo
  • on_message() 和 @bot.command 问题

    当我有on message 在我的代码中 它会停止所有其他的 bot command来自工作的命令 我尝试过await bot process commands message 但这也行不通 这是我的代码 bot event command
  • SQL Server - PIVOT - 两列转换为行

    我在一个专栏中看到了很多关于 PIVOT 的问题 每个问题都比其他问题更复杂 但是 我找不到我需要的任何内容 老实说 我什至不知道pivot在这种情况下是否能帮助我 假设我的源表中有这些数据 SELECT 1 as RowId Random
  • 混淆 .fmt 行为与嵌套列表

    The docs https docs raku org routine fmt比如说fmt 返回一个字符串 其中列表中的每个元素都已根据以下格式进行格式化 format 第一个参数 并且每个元素由 separator 第二个论点 根据该描
  • EmguCV (OpenCV) ORBDetector 仅发现不良匹配

    Problem 所以总的来说 我对计算机视觉还很陌生 我目前正在尝试通过分析 2 个图像来计算单应性 我想使用单应性来校正 1 个图像的视角以匹配另一个图像 但我得到的比赛却很糟糕而且错误 所以我所做的单应性扭曲完全关闭了 当前状态 我正在
  • 在“data.table”中使用动态列名

    我想计算 data table 中每一列的平均值 并按另一列分组 我的问题与另外两个问题类似 one https stackoverflow com questions 12391950 variably selecting assigni
  • 创建 IEnumerable.Find()

    我想写 IEnumerable
  • Hibernate Envers:检索具有集合属性的实体的正确修订

    我有两个经过审计的实体 A 和 B 实体 A 拥有实体 B 的集合 注释为一对多关系 将 A 的新实例插入数据库时 A 和 B 的所有行都处于同一修订版 假设为修订版 1 然后 A 上有一个更新 仅影响实体 B 的实例 因此 更新后 实体
  • WiX RemoveRegistryKey 元素的行为不符合广告

    卸载时我似乎无法删除注册表项 请注意 这不是重复this https stackoverflow com questions 3317281 wix doesnt remove registrykey on uninstall问题 因为我不
  • scikit-learn - 将管道预测转换为原始值/规模

    我创建了一个管道 如下所示 使用Keras Scikit Learn API https keras io scikit learn api estimators estimators append standardize Standard
  • 如何使用 jquery 禁用列表框中的多重选择?或者JavaScript?

    我的页面中有一个列表框 td 我需要禁止从列表框中选择多个项目吗 我正在做一些事情 比如选择一个项目 然后单击 删除 按钮 我的页面会从列表框中删除一项 但是如果我选择多个项目 则会抛出一条错误消息 任何人都可以帮我解决如何停用或禁用列表框
  • 熊猫重新索引日期索引按组重新访问

    之前已经问过这个问题 这里已经提出了一个可行的解决方案Pandas 在 Groupby 中重新索引日期 https stackoverflow com questions 32275540 pandas reindex dates in g
  • GraphViz:未使用新安装程序设置 Windows PATH,从 R 调用时出现问题

    在 R 库中 我使用dot程序 来自 GraphViz 来生成一些图形 通常为 png 格式 dot是一个通常的可执行文件 我通过systemR 命令 到目前为止 一切都运行良好 因为 GraphViz 安装程序正在添加dot到 PATH
  • 以 Vararg 作为第一个参数的 Kotlin 方法

    Note我查看了以下问题 答案来解决问题 但没有任何运气 从 Kotlin 调用 Java Varargs 方法 https stackoverflow com questions 36626152 call java varargs me