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

通过FUNCTIONS Kotlin为变量赋值

牟嘉
2023-03-14

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

请记住,我昨天才开始学习静态编程语言。我对所有替代方案都持开放态度。

公共趣味单打(enemyhealth:Int,enemyattack:Int,enemyname:String)

当我尝试重新分配敌人的健康时,我得到错误“无法重新分配val”,所以我试图将敌人健康和其他声明为vars

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

当我用玩家伤害减去敌人的生命值时,显示玩家受到了攻击

我正在使用Repl。it Kotlin版本1.3.72

共有1个答案

茹正祥
2023-03-14

哦,好吧,这结束了很长时间,但我希望它至少有帮助!

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

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

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

  • A可以访问变量,如finalBossHealth

您不能这样做,因为您的参数是固定的。您基本上有两个选项:

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

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

var enemyHealth = 9999

public fun singleBattle() {
    enemyHealth = enemyHealth - 100
}

在实践中,您可能会有一个敌人列表或其他东西,您会传入一个索引,以便函数可以查找并修改它。

返回一个更新的值供A使用

这是函数式方法—您传入某些数据,函数对其进行处理,并传递结果。理想情况下,如果传入相同的数据,每次都会得到完全相同的结果,因此它只依赖于参数,而不依赖于函数之外的任何状态(如类中的字段)。如果它在类之外没有任何副作用(比如在类中更改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)...
}

如果您想返回多个Fighter(因此您也有更新的敌人状态),您可能需要使用另一个包含它们的对象,例如数据类Battle(val fighter ter1: Fighter, fighter ter2: 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对象中的变量。传入的调用引用了玩家对象和怪物对象,而不是新的副本,虽然您不能更改fighter1的值(即它所指的是哪个战士对象),但您可以在该对象内部戳来戳去。所有能看到相同对象(有引用)的东西都会看到更新。因此,在调用singleBattle(player,monster1)后,您将看到player1的新值。运行状况等,因为player1在内存中指向的对象与fighter1在函数出错时指向的对象相同。

 类似资料:
  • = 赋值操作符(它的左右两边不能有空白符) 不要搞混了 = 和 -eq,-eq 是比赋值操作更高级的测试。注意:等于号(=)根据环境的不同它可能是赋值操作符也可能是一个测试操作符。 例子 4-2. 简单的变量赋值 1 #!/bin/bash 2 # 裸变量 3 4 echo 5 6 # 什么时候变量是“裸”的?比如说,变量名前面没有$? 7 #当变量被赋值

  • 主要内容:声明变量,变量赋值Java 语言是强类型(Strongly Typed)语言,强类型包含以下两方面的含义: 所有的变量必须先声明、后使用。 指定类型的变量只能接受类型与之匹配的值。 这意味着每个变量和每个表达式都有一个在编译时就确定的类型。类型限制了一个变量能被赋的值,限制了一个表达式可以产生的值,限制了在这些值上可以进行的操作,并确定了这些操作的含义。 常量和变量是 Java 程序中最基础的两个元素。常量的值是不

  • 我的代码是这样的: 但最后一句话: 总是停止编译说我需要给新变量分配一个返回值?在if语句之前,已经为k分配了一个值。当我把随机k语句放在if语句中时,它似乎是有效的,但这使得它毫无价值,不是吗?编辑器本身没有错误,但是当我编译时,它给了我这个: 线程“main”java中出现异常。lang.IndexOutOfBoundsException:索引:41,大小:36。util。ArrayList。

  • 原文: http://exploringjs.com/impatient-js/ch_variables-assignment.html 下面这些是 JavaScript 声明变量的主要方式: let用来声明可变变量。 const用来声明常量(不可变变量)。 在ES6之前,还有var。但它有些怪癖,所以最好在现代JavaScript程序中避免使用它。你可以在“Speaking JavaScript

  • 问题内容: 在这段代码中,最后,我为c1分配了一个值,但是当我打印它时,我在所有c1字段中都得到了null。我为Cliente类写下了代码。我想打印我给c1的所有值,但我不知道为什么在所有字段中都打印null。我使用调试器遵循代码,直到将所有值分配给新变量的语句为止,一切都正确。 问题答案: 你应该改变这个 至 您正在为方法参数而不是字段分配值。同样适用于构造函数中的所有参数。