我该如何修复这个特定的 "Val cannot be reassigned" 错误?
How can I fix this particular "Val cannot be reassigned" error?
我的这段代码一直给我一个“无法重新分配 Val”的错误,但我似乎无法将变量更改为 var 而不是 val。我只是希望能够为我的单元格引用设置一个字符串值,这样我以后就可以像这样访问这些值 myStringsArrayList.add(deviceData.cellOne)
.
这是我的代码:
val cells = listOf(
deviceData.cellOne,
deviceData.cellTwo,
deviceData.cellThree,
deviceData.cellFour,
deviceData.cellFive,
deviceData.cellSix,
deviceData.cellSeven,
deviceData.cellEight,
deviceData.cellNine,
deviceData.cellTen,
deviceData.cellEleven,
deviceData.cellTwelve,
deviceData.cellThirteen,
deviceData.cellFourteen
)
for ((i, cell) in cells.withIndex()) {
val value = data[2 + i].toDouble() / 100 + 3.52
val cellNumberString = (i + 1).toString()
val formattedString = "Cell $cellNumberString: %.2fV".format(value)
cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
}
有谁知道我如何解决这个问题并实现我想要的功能?
我尝试使用 listIterator()
,但它似乎没有按照我想要的方式工作。
这是我对 listIterator()
的尝试:
val cells = mutableListOf(
deviceData.cellOne,
deviceData.cellTwo,
deviceData.cellThree,
deviceData.cellFour,
deviceData.cellFive,
deviceData.cellSix,
deviceData.cellSeven,
deviceData.cellEight,
deviceData.cellNine,
deviceData.cellTen,
deviceData.cellEleven,
deviceData.cellTwelve,
deviceData.cellThirteen,
deviceData.cellFourteen)
val iterate = cells.listIterator()
while (iterate.hasNext()) {
var cell = iterate.next()
val value = data[2 + iterate.nextIndex()].toDouble() / 100 + 3.52
val cellNumberString = (iterate.nextIndex() + 1).toString()
val formattedString = "Cell $cellNumberString: %.2fV".format(value)
cell = formattedString
}
你不能把它变成 var
,反正也没有理由!
for ((i, cell) in cells.withIndex()) {
...
cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
}
您正在一个集合上创建一个 for
循环,带有一个索引,并为每个循环提供一个代码块 运行。因此,当循环 运行s 时,您将获得两个参数 - 集合中的当前项目及其在该集合中的索引。
这些只是在循环中使用的内部变量 - 您不能重新分配它们,因为它们是传入的值。即使可以,您也只是更改那些局部变量的值.
您可能想要做的是更新 cells
列表,获取循环中的当前项目,在 cells
中找到它并替换它。您必须实际更新 cells
才能做到这一点!更改列表本身。您可以使用 cells[i] = formattedString
- 但是 因为您目前正在迭代 cells
集合,所以您不应该修改它!
您可以复制源列表,但典型的 Kotlin 方法是使用 map
(转换值)创建一个新列表:
cells.mapIndexed { i, cell ->
val value = data[2 + i].toDouble() / 100 + 3.52
val cellNumberString = (i + 1).toString()
// last expression is the return value, i.e. the formatted string
"Cell $cellNumberString: %.2fV".format(value)
}
这将吐出一个新的(不可变的)列表,其中每个单元格都已 映射 到该格式化字符串版本。
您可以将 cells
设为 var
并重新分配它:
cells = cells.mapIndexed { ... }
或者在初始化 val
时链接映射调用,这样最终结果就是被分配的结果:
val cells = listOf(
...
).mapIndexed { ... }
但是您实际上并没有在那个循环中使用 cell
,只是使用索引来生成值。 You can create a list like this:
val data = List(14) { i ->
val value = data[2 + i].toDouble() / 100 + 3.52
// you can calculate the index inside the string by using braces
"Cell ${i + 1}: %.2fV".format(value)
}
这完全取决于您是否需要为任何东西保留 devicedata
值列表(如果需要,请使用它来创建 另一个 列表)
您可能想这样使用交互器:
val list = mutableListOf("One", "Two", "Three", "Four")
println(list.joinToString(" "))
val iterator = list.listIterator()
while(iterator.hasNext()) {
val value = iterator.next()
if (value == "Two") {
iterator.set("xxxxxx")
}
}
println(list.joinToString(" "))
使用'set'方法。
我的这段代码一直给我一个“无法重新分配 Val”的错误,但我似乎无法将变量更改为 var 而不是 val。我只是希望能够为我的单元格引用设置一个字符串值,这样我以后就可以像这样访问这些值 myStringsArrayList.add(deviceData.cellOne)
.
这是我的代码:
val cells = listOf(
deviceData.cellOne,
deviceData.cellTwo,
deviceData.cellThree,
deviceData.cellFour,
deviceData.cellFive,
deviceData.cellSix,
deviceData.cellSeven,
deviceData.cellEight,
deviceData.cellNine,
deviceData.cellTen,
deviceData.cellEleven,
deviceData.cellTwelve,
deviceData.cellThirteen,
deviceData.cellFourteen
)
for ((i, cell) in cells.withIndex()) {
val value = data[2 + i].toDouble() / 100 + 3.52
val cellNumberString = (i + 1).toString()
val formattedString = "Cell $cellNumberString: %.2fV".format(value)
cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
}
有谁知道我如何解决这个问题并实现我想要的功能?
我尝试使用 listIterator()
,但它似乎没有按照我想要的方式工作。
这是我对 listIterator()
的尝试:
val cells = mutableListOf(
deviceData.cellOne,
deviceData.cellTwo,
deviceData.cellThree,
deviceData.cellFour,
deviceData.cellFive,
deviceData.cellSix,
deviceData.cellSeven,
deviceData.cellEight,
deviceData.cellNine,
deviceData.cellTen,
deviceData.cellEleven,
deviceData.cellTwelve,
deviceData.cellThirteen,
deviceData.cellFourteen)
val iterate = cells.listIterator()
while (iterate.hasNext()) {
var cell = iterate.next()
val value = data[2 + iterate.nextIndex()].toDouble() / 100 + 3.52
val cellNumberString = (iterate.nextIndex() + 1).toString()
val formattedString = "Cell $cellNumberString: %.2fV".format(value)
cell = formattedString
}
你不能把它变成 var
,反正也没有理由!
for ((i, cell) in cells.withIndex()) {
...
cell = formattedString // THIS IS WHERE THE PROBLEM IS (cell is a val)
}
您正在一个集合上创建一个 for
循环,带有一个索引,并为每个循环提供一个代码块 运行。因此,当循环 运行s 时,您将获得两个参数 - 集合中的当前项目及其在该集合中的索引。
这些只是在循环中使用的内部变量 - 您不能重新分配它们,因为它们是传入的值。即使可以,您也只是更改那些局部变量的值.
您可能想要做的是更新 cells
列表,获取循环中的当前项目,在 cells
中找到它并替换它。您必须实际更新 cells
才能做到这一点!更改列表本身。您可以使用 cells[i] = formattedString
- 但是 因为您目前正在迭代 cells
集合,所以您不应该修改它!
您可以复制源列表,但典型的 Kotlin 方法是使用 map
(转换值)创建一个新列表:
cells.mapIndexed { i, cell ->
val value = data[2 + i].toDouble() / 100 + 3.52
val cellNumberString = (i + 1).toString()
// last expression is the return value, i.e. the formatted string
"Cell $cellNumberString: %.2fV".format(value)
}
这将吐出一个新的(不可变的)列表,其中每个单元格都已 映射 到该格式化字符串版本。
您可以将 cells
设为 var
并重新分配它:
cells = cells.mapIndexed { ... }
或者在初始化 val
时链接映射调用,这样最终结果就是被分配的结果:
val cells = listOf(
...
).mapIndexed { ... }
但是您实际上并没有在那个循环中使用 cell
,只是使用索引来生成值。 You can create a list like this:
val data = List(14) { i ->
val value = data[2 + i].toDouble() / 100 + 3.52
// you can calculate the index inside the string by using braces
"Cell ${i + 1}: %.2fV".format(value)
}
这完全取决于您是否需要为任何东西保留 devicedata
值列表(如果需要,请使用它来创建 另一个 列表)
您可能想这样使用交互器:
val list = mutableListOf("One", "Two", "Three", "Four")
println(list.joinToString(" "))
val iterator = list.listIterator()
while(iterator.hasNext()) {
val value = iterator.next()
if (value == "Two") {
iterator.set("xxxxxx")
}
}
println(list.joinToString(" "))
使用'set'方法。