在像Swift这样的其他语言中,有可能创建一个添加新构造函数的函数扩展.
像这样的东西:
// base class
class Whatever() {
...
}
// constructor method extension
fun Whatever.constructor(potato: String) {
setPotato(potato)
}
fun main(args: Array<String>) {
println(Whatever("holi"))
}
Run Code Online (Sandbox Code Playgroud)
在Kotlin有没有办法做到这一点?
要阅读Facebook Hacker Cup 2016 Boomerang Constelations问题中的文件星标,可以定义以下扩展功能:
fun BufferedReader.readStars(n: Int): Set<Star> {
return Array(n) {
val (l1, l2) = readLine().split(" ").map { it.toInt() }
Star(l1, l2)
}.toHashSet()
}
Run Code Online (Sandbox Code Playgroud)
代码很紧凑,但首先将值读入数组,然后转换为a HashSet.有没有办法在Kotlin中直接初始化a 和sizeizator函数HashSet的大小n?
更新:标准Kotlin库中是否存在现有方法?
在Scala中,有一种方便的约定,即使用伴随对象的apply方法通过伴随对象提供集合工厂方法.所以,如果我想创建一个包含元素1,2和3的列表,我只是使用List(1, 2, 3).该模式在所有集合类型中都是一致的.
在Kotlin,如果我写,List(1, 2, 3)我得到编译错误.要创建包含1,2和3的列表,必须使用listOf(1, 2, 3). List是一个接口,所以它显然没有构造函数.可能有一个伴侣对象,但没有一个.有一个List函数,虽然签名不同于Scala(public inline fun <T> List(size: Int, init: (index: Int) -> T): List<T>)的预期.
那么,为什么Kotlin集合库设计者选择不遵循类似于Scala中的集合工厂的统一约定?
kotlin ×3