是否可以将引用传递给基本数组的第i个元素?

时间:2017-11-14 16:24:47

标签: arrays kotlin primitive

现在,在我的代码中的某处,我传递了对基元的引用,例如Int

val i = 0

fun whatever(i: KMutableProperty0<Int>)

作为

whatever(::i)

能够从函数

中获取/设置其值 到目前为止,一切都很顺利。

我现在想对原始数组的第i个元素执行相同的操作,例如IntArray

val arr = intArrayOf(1, 2, 3)

whatever(/* passing the reference to item 2 of arr*/)

有可能吗?

2 个答案:

答案 0 :(得分:0)

如何将引用传递给arr属性和索引?

fun whatever(arr: KMutableProperty0<IntArray>, index: Int)

whatever(::arr, i)

答案 1 :(得分:0)

这是不可能的,因为Java不允许对数组进行指针操作。 Kotlin这样做(如果可能的话,在字节码级别)会破坏互操作性。

编辑:您似乎不关心 true 数组指针,就像在C中一样,因此您可以创建类似于KMutableProperty的包装器:

class IntArrayRef(val array: IntArray, val index: Int) {
    fun get(): Int = array.get(index)
    fun set(value: Int) { array[index] = value }
}

fun modify(value: IntArrayRef) {
    value.set(4)
}

fun test() {
    val s = "abc"
    val arr = intArrayOf(1, 2, 3)
    modify(IntArrayRef(arr, 1))
}

我的猜测是你需要为每个本机数组类型手动创建一个包装器,因为they are exposed at the Kotlin level as non generic types