intellij-idea - 从Kotlin中的另一个扩展方法调用扩展方法时发生编译错误

标签 intellij-idea kotlin intellij-14

当我尝试从另一个扩展方法(重载该方法)调用扩展方法时,它无法在IntelliJ 14.1.5和Kotlin 0.14.449中进行编译

由于我是该语言的新手,因此在引用中并不禁止这样做,所以我想知道:

  • 是否可以从另一个扩展方法调用扩展方法?
  • 我使用的语法是否正确(因此这是一个错误)?
  • 如果不是,正确的语法是什么?

  • 这是无法编译的代码:
    fun String.replace (prefix: String, suffix: String, vararg parameters: Pair<String, String>) =
        parameters.fold(this, { result, pair -> result.replace (prefix + pair.first + suffix, pair.second) })
    
    fun String.replace (vararg parameters: Pair<String, String>) =
        this.replace ("", "", parameters)
    

    提前致谢!

    最佳答案

    还有其他答案,但是这里有更多关于正在进行的事情的注释,并且采用了类似的解决方案,可以保持方法命名,避免递归并为两种方法签名保留varargs:

  • 当将一个varargs传递给另一个时,您需要使用spread operator,因为varargs是作为数组接收的,您想将它们转换回参数列表,并且散布运算符就是这样做的。
  • fold() lambda内部的调用意外地自行调用。由于您使用2个参数调用string.replace(),哪个版本胜出?版本string.replace(String, String, vararg Pair<String,String>)string.replace(String, String, Boolean[defaulted to false])?当仅使用2个参数调用时,它们看起来都相同。并且本地一获胜,因此您可以进行递归。要强制调用stdlib replace函数,第3个参数默认为false,因此请专门传递该值,以便找到正确的方法签名。

  • 工作代码:
    fun String.replace(prefix: String, suffix: String, vararg parameters: Pair<String, String>) {
        parameters.fold(this) { result, pair ->
            // add a last parameter to differentiate what version I want called, the one with optional
            // boolean parameter last (ignoreCase: Boolean = false).  Otherwise this recurses on accident.
            result.replace(prefix + pair.first + suffix, pair.second, false)
        }
    }
    
    fun String.replace(vararg parameters: Pair<String, String>) {
        this.replace ("", "", *parameters) // add * spread operator
    }
    

    关于intellij-idea - 从Kotlin中的另一个扩展方法调用扩展方法时发生编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079617/

    相关文章:

    IntelliJ 14 中的 Android/Scala 项目编译,但在启动时崩溃,找不到 Scala 类

    java - 无法解决maven项目中的import classes

    android - IntelliJ中的任务 ':app:compileDebugJavaWithJavac'执行失败

    intellij-idea - IntelliJ IDEA查找方法覆盖

    intellij-idea - Groovy类上IntelliJ中的“Class already exists”错误

    java - 在 intelliJ 中自动生成 Javadoc 注释?

    maven - 如何让 IntelliJ IDEA 从 Maven 更新我的依赖项?

    kotlin - 如何确定一个对象是否继承自 Kotlin 中的某个类?

    java - 将 Uni 事件带回调用者线程

    java - 更新到 Android Studio 3.1 后,我遇到了这个错误 : Could not find org. jetbrains.kotlin :kotlin-stdlib-jre8:1. 2.0