我知道传递给函数的参数将被视为“val”,即使变量被初始化为“var”。但这对我来说是一个问题。在下面的此示例代码中,我想通过使用函数“changeNum”来修改变量“num”的值。但是,当然,科特林不允许我修改它。我该如何解决这个问题?如何使用“更改数字”函数来修改变量“num”?
fun main() {
var num: Int = 5
changeNum(num)
}
fun changeNum(num: Int){
num += 2
print(num)
}
在我的项目中,我定义了一个泛型类型来封装所有标量类型,包括原语和用户定义的。
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
这不是最干净的解决方案,但它可以在不使用静态编程语言内置功能的情况下完成,这些功能将来可能会被修改。
可以在科特林使用房产来做到这一点
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
函数放在数据类中!
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如下所示:
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函数具有相同的访问权,如下所示: