有没有办法在多次调用的静态函数中重用 Kotlin 中的变量?

问题描述 投票:0回答:2

我刚刚发现函数参数在 Kotlin 中是不可变的。我期待着可变性,但我发现的官方文档中没有提及这一点。我个人认为应该有某种方法可以在 Kotlin 中的多个静态函数中重用单个变量。这怎么可能是不可变的参数呢?我试图不返回使用的值,只返回数组,重用值,例如它的索引或在不同函数中使用的相同变量,不需要从其他函数访问数据。与其他语言一样,数据事物可以传递和使用,但可能无法在其他函数中读取,但它支持编写事物并在静态函数范围内使用它。

我尝试过 Kotlin Playground,我期望有一个 var param 的东西,但没有。我尝试了数组和列表,发现在 Kotlin 游乐场中,可以设置成员,但不能设置原始数组或列表。我的问题是这是否可以编译。这样我就可以将所有变量放入数组或列表中并根据需要进行设置。不管怎样,问题是:Kotlin 中的一组静态函数如何在多次调用中重用一个或多个变量(如 var)?这是为了效率,更多的变量,更多的垃圾收集,更慢的程序,我更喜欢更快的程序。

function kotlin compilation parameter-passing static-methods
2个回答
1
投票

Kotlin 不支持通过引用传递函数参数。参数总是被复制。 Kotlin 的主要目标平台也不支持它:Java 和 JavaScript。

如果你真的想这样做,你可以创建一个简单的包装器并将其传递:

fun test(value: Wrapper<String>) {
    value.value = "foo"
}

data class Wrapper<T>(var value: T)

然而,这并不是真正的“Kotlin 方式”。在 Kotlin 或 Java 等语言中,我们假设函数/方法接收参数并返回新值。我们可以修改传递的对象,如果函数的名称明确提到这一点,这不被认为是一个坏习惯。但通过参数返回结果或替换调用者的变量,对于 C 等语言来说比 Kotlin/Java 更常见。我相信 Kotlin/Native 对指针有一些支持,所以这是可能的。


-1
投票

据我了解,任何具有属性的对象都可以重用该属性,包括 Array、List 和 IntArray。但这在 Kotlin 中并不是首选方式,正如 Louis Wasserman 所说,这可能会对性能产生负面影响。

据我了解,首选方法是拥有一个带有伴生对象的类,并且在该伴生对象内部有一个 var 事物和一个使用该 var 事物的函数。如果我想要静态函数和变量,请使用 @JvmStatic 来注释所有应该是静态的。我知道在 Java 中,第一个和第二个工作等效,第一个较慢,第二个较快。

第二个的唯一问题是每个变量一次只能执行一个函数调用。解决此问题的一种方法是每个函数使用不同的变量。我发现数组和列表会根据函数调用而变化,并且在函数调用之外保持变化,无论是否为 val。

fun test(x:DoubleArray):DoubleArray {
   x[0]+=2.0;
   return x;
   //Works here at least on JVM
}

fun main() {
    ar:DoubleArray=DoubleArray(2);
   println(test(ar)[0]);
   println(ar[0]);
   //Both print 2.0 on JVM
   println(ar[1]);
   //X E
}
class Test private constructor(){
    companion object {
        var variable:Double = 0.0;
        fun test() {
            Test.variable=2.0;
        }
    }
}

第一个是如何允许使用数组或列表部分。其次是如何进行静态变量的使用。我进行了测试,两者都适用于我可以在 Kotlin Playground 上使用的所有平台。

为了重用变量,使用静态列表或数组并传递要使用的静态变量的索引将允许静态变量异步。由于有些可能首先完成较低的索引,因此可能需要一个自由变量。根据我的经验,Java 函数的速度按以下顺序排列:常规非静态较慢,更改参数的静态中等,仅更改静态变量的静态函数最快。为了简单起见,我可能会尝试中间,但为了快速起见,使用静态列表和可变票证系统。像这样:

class XE private constructor() {
    companion object {
        @JvmStatic
        var ints:IntArray=IntArray(1);
        @JvmStatic
        var freeInts:BooleanArray=BooleanArray(1){true};
        @JvmStatic
        fun test(Int ticket=0) {
            freeInts[ticket]=false;
            ints[ticket]=2;
            //Use ints[ticket]
            freeInts[ticket]=true;
            //X E
        }
        //X E
        @JvmStatic
        fun getTicket(free:BooleanArray):Int{
            Int index = 0;
            while (!free[index]&&index!=free.size) {
                index+=1;
            }
            //X E
            return index;
            //X E
        }
        //X E
    }
    //X E
}
//X E

为此,应该有一张可用的抢先票。我知道这个可以编译,我在 Kotlin Playground 上尝试过,我可以的所有平台,X E。

© www.soinside.com 2019 - 2024. All rights reserved.