gpt4 book ai didi

kotlin - 如何在伴随对象中使用扩展函数

转载 作者:行者123 更新时间:2023-12-01 13:12:59 24 4
gpt4 key购买 nike

是否可以在类的伴随对象中定义和使用扩展函数?

在此示例中,removePadding()Point.parse() 中使用的扩展函数。

data class Point(private var x: Int, private var y: Int) {
companion object {
fun parse(text: String?) = text?.removePadding()
?.let { "(\\d+),(\\d+)".toRegex().find(it) }
?.mapNotNull { it.toIntOrNull() }
?.let { Point(it[0], it[1]) }

// define removePadding() here?
}

// define removePadding() here?
}

扩展函数 removePadding() 可能如下所示:

fun String.removePadding() = this.replace("\\s+".toRegex(), "")

parse 函数可以这样调用:

val one = Point.parse("1, 7")

如果可能,怎么做?如果不是,为什么不呢?

最佳答案

您基本上可以将扩展放在任何这些地方,正常声明它:

private fun String.removePadding() = this.replace("\\s+".toRegex(), "")

private 修饰符限制对伴随对象或 data 类的可见性,具体取决于您放置它的位置。通常,人们应该更喜欢声明的尽可能窄的可见范围。

另一种选择是在 parse 函数中本地声明扩展函数(注意这次它没有可见性修饰符):

data class Point(private var x: Int, private var y: Int) {
companion object {
fun parse(text: String?): Point? {
fun String.removePadding() = this.replace("\\s+".toRegex(), "")

return text?.removePadding()
?.let { "(\\d+),(\\d+)".toRegex().find(it) }
?.groupValues?.map { it.toIntOrNull() ?: return null }
?.let { (x, y) -> Point(x, y) }
}
}
}

关于kotlin - 如何在伴随对象中使用扩展函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877705/

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