Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过functions Kotlin为变量赋值_Kotlin - Fatal编程技术网

通过functions Kotlin为变量赋值

通过functions Kotlin为变量赋值,kotlin,Kotlin,当通过函数构造函数fun funname()创建变量时(这就是它们的名称吗?),它们似乎被声明为vals。由于VAL无法重新赋值(出于某些原因,我需要这样做),我想知道是否有办法在函数之前的一行代码中将变量声明为var,然后通过函数赋值 请记住,我昨天才开始学习Kotlin。我愿意接受所有的选择 public-fun-singlebattle(enemyhealth:Int,enemyattack:Int,enemyname:String) 当我尝试重新分配敌人的生命值时,我得到错误“无法重新分

当通过函数构造函数
fun funname()
创建变量时(这就是它们的名称吗?),它们似乎被声明为
vals
。由于
VAL
无法重新赋值(出于某些原因,我需要这样做),我想知道是否有办法在函数之前的一行代码中将变量声明为
var
,然后通过函数赋值

请记住,我昨天才开始学习Kotlin。我愿意接受所有的选择

public-fun-singlebattle(enemyhealth:Int,enemyattack:Int,enemyname:String)

当我尝试重新分配敌人的生命值时,我得到错误“无法重新分配val”,因此我尝试将
enemyhealth
和其他声明为
vars

错误出现在此处:
enemyhealth=enemyhealth-playerstats[1]

当我用玩家伤害减去
enemyhealth
表示玩家受到攻击

我正在使用Repl.it Kotlin 1.3.72版

oooookay,结果很长,但我希望它至少有帮助

这不是一个构造函数,因为它不是构造一个对象-它只是一个函数定义,当您使用
singleBattle()
调用该函数时,您需要通过将列出的参数放在括号中来传递它们

首先是的,传递到函数中的参数在函数块内变成本地
val
s-它们是只读的。您可以对它们进行处理,并将结果分配给在函数中声明的另一个
val
var

但我假设你实际上想做的是这样的:

  • A可以访问变量,如
    finalBossHealth
  • A将
    finalBossHealth
    传递到函数B(作为
    enemyhealth
  • B更改
    enemyHealth
  • A在
    finalBossHealth
    中看到这种变化,因为它是“同一个变量”
您不能这样做,因为您的参数是固定的
val
s。您基本上有两种选择:


在函数外部定义变量,其中A和B都可以看到它们

只要函数和变量(字段)在同一个类中,它就在同一个范围内,并且可以直接更改它们。在这种情况下,传递该值没有实际意义,因为它可以直接读写它们

var enemyHealth = 9999

public fun singleBattle() {
    enemyHealth = enemyHealth - 100
}
实际上,您可能会有一个敌人列表或其他东西,您会传入一个索引,以便函数可以查找并修改它


返回要使用的更新值

这是一种函数式方法——您传入某些数据,函数对其进行处理,然后将结果传递出去。理想情况下,如果传入相同的数据,每次返回的结果都完全相同——因此它只依赖于参数,而不依赖于函数之外的任何状态(如类中的字段)。如果它在类之外没有任何副作用(比如在类中更改
var
),那么它被称为纯函数

这些很容易推理,因为它们只做一件事——输入值,得到特定的结果,很容易

public fun singlebattle(enemyhealth : Int, enemyattack : Int , enemyname : String): Int {
    // calculate whatever
    return updatedHealth;
}
这个函数只返回一个
Int
,因此调用者将调用
singleBattle
,然后对结果进行处理
singleBattle
不需要知道任何关于外部状态的信息,它只需要获取一些值,并对它们做一些有用的事情

如果您需要返回不止一个值(比如说攻击可以减少),您可以创建某种数据结构来保存一组值:

data class Fighter(val health: Int, val attack: Int, val name: String)

public fun singlebattle(player: Fighter, enemy: Fighter): Fighter {
    // calculate the player's state after the fight
    return player.copy(health = newHealth)
    // or just return Fighter(newHealth, player.attack, player.name)...
}
如果您想返回多个
战斗机
(因此您也有更新的敌方状态),您可能需要使用另一个包含这两个状态的对象,例如
数据类Battle(val fighter1:Fighter,fighter2:Fighter)


通过利用将引用传递给函数的事实,您可以将这些功能结合起来(并失去纯函数的优点,但这样做可能更容易):

// I'm using vars here because we're gonna change them
data class Fighter(var health: Int, var attack: Int)

val player = Fighter(100, 999)
val monster1 = Fighter(9999, 5)

singleBattle(player, monster1)

fun singleBattle(fighter1: Fighter, fighter2: Fighter) {
    // do the fight, update the values
    fighter1.health = fighter1.health - fighter2.attack
    // etc... you can also say fighter1 -= fighter2.attack as a shorthand
}

此函数不返回任何内容,因为它只是更改传入的
Fighter
对象中的变量。传入的调用引用了
玩家
怪物1
对象,不是新副本,尽管您不能更改
战斗机1
的值(即它所指的
战斗机
对象),但您可以在该对象内部戳来戳去。所有能看到同一个对象(有对它的引用)的东西都会看到更新。因此,在调用
singleBattle(player,monster1)
后,您将看到
player1.health
等的新值,因为
player1
指向内存中的
Fighter
对象,而
fighter1
在函数顶部,创建一个var:
var mutableEnemyHealth=enemyhealth
然后改为:
mutableEnemyHealth=…
你能给我举个例子吗?我做了我认为你的意思,我得到了以下错误:
属性必须初始化或是抽象公共变量mutableEnemyhealth:Int
值参数public fun singlebattle上需要类型注释(enemyhealth=mutableEnemyhealth,enemyattack:Int,enemyname:String){
确实解释了吗?啊,是的。现在答案很清楚了,非常感谢你们两位,我对迟来的答复表示歉意。看来我需要更多地跳出框框思考。你为此付出了很多努力。绝对值得一次投票:谢谢你,我的朋友。我为迟来的答复道歉,因为我当时在学校。我认为你的回答真的帮助了我从整体上理解kotlin语言,变量处理,以及我需要做些什么来获得我想要的结果。我将引用bac