当前位置: 首页 > 知识库问答 >
问题:

如何将一个变量从主函数传递到另一个函数并对其进行修改?(科特林)

徐文彬
2023-03-14

我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说是一个问题。在下面的此示例代码中,我想通过使用函数“changeNum”来修改变量“num”的值。但是,当然,科特林不允许我修改它。我该如何解决这个问题?如何使用“更改数字”函数来修改变量“num”?

fun main() {
    var num: Int = 5
    changeNum(num)
}

fun changeNum(num: Int){
    num += 2
    print(num)
}

共有3个答案

佴英奕
2023-03-14

在我的项目中,我定义了一个泛型类型来封装所有标量类型,包括原语和用户定义的。

     data class pTp<T>(var v: T)  

所以我可以创建

    fun PercAcumNorm(percAcum:pTp<Double>, perc:pTp<Double>, 
              valor:Double, Soma:Double)
    { 
      perc.v = valor/soma
      parcAcum.v += perc.v
    } 

那么你只需要打电话

   ....
   var pAcum:pTp<Double> = pTp(0.40)
   var p = 0
   var valor = 5
   var soma = 100      
   percCalc(pAcum, p, soma, valor)
   println(pAcum.v)  // it prints 0.45 

这不是最干净的解决方案,但它可以在不使用静态编程语言内置功能的情况下完成,这些功能将来可能会被修改。

邴和雅
2023-03-14

可以在科特林使用房产来做到这一点

import kotlin.reflect.KMutableProperty0

var num = 1

fun main() {
    println(num)
    changeNum(::num)
    println(num)
}

fun changeNum(numProperty: KMutableProperty0<Int>) {
    numProperty.set(12345)
}

>> 1
>> 12345

KMutableProperty ty0表示基本的var,因此您可以使用::num语法传入属性引用(与传递函数引用的方式相同)。这样,您就可以为函数提供对属性本身的引用,而不是传递当前值,然后您可以在其上调用set

但问题是,你真的想这样做吗?还是您过于复杂化了应该以更简单的方式完成的事情,或者更具可读性?你实际上不能用一个变量来做到这一点,就像你试图在有趣的main()中做的那样,只在一个对象上做属性(基本上是顶级vars) - 但即使你可以,你为什么不这样做呢?

fun main() {
    var num: Int = 5
    ...
    num = changeNum(num) // this would need renaming but y'know
}

它仍然是一个单行调用,您的changeNum函数仍然可能有副作用,进行验证等,它只是返回结果而不是将其设置为副作用。这更容易遵循,特别是当它是为事物设置值的常用方法时。

如果您真的想使用引用,但在类中使它们成为顶级引用很混乱,那么可以考虑创建一个状态对象:

import kotlin.reflect.KMutableProperty0

data class AllThemNums(var num1 :Int = 1, var num2: Int = 9999)

fun main() {
    val nums = AllThemNums(num1 = 5)
    changeNum(nums::num1)
    println(nums)
}

fun changeNum(numProperty: KMutableProperty0<Int>) {
    numProperty.set(numProperty.get() + 2)
}


>> AllThemNums(num1=7, num2=9999)

甚至可以将changeNum函数放在数据类中!

刘选
2023-03-14

Kotlin是按值传递的,所以不能直接用像< code>Int这样的基本类型来传递。

通常的方法是只返回一个新值,而不是修改作为参数接收的内容(函数方法)。从调用代码的角度来看,它更清晰:

fun main() {
    var num: Int = 5
    num = changeNum(num)
}

fun changeNum(num: Int): Int {
    val newValue = num + 2
    print(newValue)
    return newValue
}

如果你真的想改变变量,而不是返回一个新值,这里有两种方法可以实现:

  1. 将对此值进行操作的所有代码放入一个类中,并使局部变量成为该类的属性(这是 OO 方法)
  2. 将此基元变量放入类中,并传递该类的实例

选项1如下所示:

class SomeClass(var num: Int) {

    fun changeNum() {
        num += 2
        print(num)
    }
}

fun main() {
    val container = SomeClass(5)
    container.changeNum()
}

选项2如下所示:

class SomeMutableContainer(var num: Int)

fun main() {
    val container = SomeMutableContainer(5)
    changeNum(container)
}

fun changeNum(container: SomeMutableContainer) {
    container.num += 2
    print(container.num)
}
 类似资料:
  • 问题内容: 在大多数语言(如c ++)中,传递数组会导致通过引用隐式传递它,因此对函数中传递的数组进行的任何更改都将导致更改原始数组。我正在学习Golang,在Alan AA Donovan和Brian W. Kernighan撰写的《 Go编程语言》一书中,它的行为不同于其他语言-不会隐式地通过引用传递数组。 这让我有些困惑-这是否意味着在没有引用的情况下传递数组不应该修改数组本身?让我说明一下

  • 问题内容: 我不太明白为什么我不能将Int []从一个函数传递到另一个函数: 这给了我以下错误: 谢谢你的帮助! 问题答案: 中的参数称为 可变参数 。这意味着您可以传入该参数类型的可变数量,并且传入的所有内容都将转换为该类型的数组,以供您在函数中使用。 因此,内部的参数是一个数组,而不是所期望的一组参数。 您可能想要像这样重载以接受其中任何一个,因此您的平均函数可以调用适当的版本:

  • 问题内容: 我有两个 newAccessLevels.java ,它有两个按钮“ Level 1”,“ Level 2”和 newAccessPanel.java。 我需要获取用户选择“ 1或2”的级别,以便可以在标题中显示它。 accessPanel.java, 例如访问级别1,访问级别2。如何完成此操作。下面是示例代码,因此,如果单击级别1,则将打开标题为* ACCESS LEVEL 1 的n

  • 问题内容: 我想将传递给function()的所有参数作为参数传递给内部的另一个function(), 这可以在被调用过程中完成并将它们传递给,但是还有另一种方法吗? 本来 但是如果我的func1签名是 我如何将它们全部发送到func2,而不使用 有没有一种方法像在javascript中? 问题答案: 显式比隐式更好, 但是如果您真的不想键入一些字符,请执行以下操作: 都是局部变量,因此您不能在调

  • 我试图学习功能性Kotlin,并编写了以下测试代码: 在REPL中,我可以成功调用“findBorrowerX”: 但是我如何拨打“findBorrowerX2”的电话: 并将迭代的借用器x传递给getName?? 这看起来有关联,但我不确定: Kotlin:如何将一个函数作为参数传递给另一个? 提前感谢您对此的帮助! 编辑: 下面是我想做的等效Scala代码: 也许这在科特林是不可能的?

  • 问题内容: 我尝试了以下失败的尝试: 在函数a中,我可以使用arguments关键字来访问参数数组,而在函数b中,这些参数将丢失。有没有办法像我尝试的那样将参数传递给另一个javascript函数? 问题答案: 用于对in函数具有相同的访问权,如下所示: