我有一个数据类,即:
val data = arrayOf("x", "y", "z", "a", "b")
我有一个字符串数组:data
我想在创建Entry的新实例时将val entry = Entry(data[0], data[1], data[2], data[3], data[4])
数组作为参数传递。我不希望这样做:Entry(*data)
我尝试过使用点差运算符:vararg
但是它给出了一个错误,说明这里不允许使用点差运算符。这是因为参数不是varargs
。另请注意,数据类的构造函数中不允许component1(), component2()...
。
在Kotlin中是否有任何方法可以将数组扩展到非可变参数函数(具有固定数量参数的函数),特别是如果您知道该数组的长度将始终相同?
在各种搜索之后,我还没有找到答案。可以使用一些帮助。感谢。
编辑:对于数组/列表的前5个元素,Kotlin中的集合确实有component5()
个方法一直到val (a, b, c, d, e) = data
。因此,这允许进行解构赋值:Entry(a, b, c, d, e)
。然后你可以将它们传递给函数/构造函数:Map(s -> 3, h -> 2, M -> 1, q-> 4)
。
但这只是解决方案的一半,因为你只限于前5个元素,而且它比简单的点差运算符更冗长。
答案 0 :(得分:1)
我认为你最好的办法是让你的构造函数变得私有,而是依赖工厂方法。通常应将构造函数视为较低级别的特性,只需从给定值进行简单初始化即可。
因此声明一个可变工厂方法,该方法具有将数组中的数据铲除到构造函数的所有样板。您可以使用解构分配来稍微改善代码的外观。
请注意,没有什么可以阻止您宣布其他Array.componentN
作为扩展功能:
fun entry(args: Array<String>) = args.let {
(name, address, phoneNo, amt, remark, oneMore) ->
Entry(name, address, phoneNo, amt, remark, oneMore)
}
operator fun <T> Array<T>.component6() = get(5)
答案 1 :(得分:0)
您可以创建扩展乐趣
inline fun Array<String>.toEntry() = Entry(
this[0],
this[1],
this[2],
this[3],
this[4]
)