在 Lua 中的函数内进行循环,Computercraft
For loop inside a function in Lua, Computercraft
我正在学习计算机技术 (minecraft) 的编程,但在读取一些存储单元时遇到了一些问题。
我正在处理的函数将遍历所有单元格并将存储容量加在一起到 for 循环中的一个变量。
这是我目前得到的
local cell1 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2")
local cell2 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3")
local cell3 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4")
local cell4 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5")
local cell5 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6")
local cell6 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7")
cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"}
local totStorage
function getTotStorage(table)
for key = 1,6 do
x = table[key]
totStorage = totStorage + x.getMaxEnergyStored()
end
print(totStorage)
end
我在这一行遇到错误
totStorage = totStorage + x.getMaxEnergyStored()
说 "Attempt to call nil"。
有什么建议么?
cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"}
是 shorthand 用于:
cells = {
-- key value
[1] = "cell1",
[2] = "cell2",
[3] = "cell3",
[4] = "cell4",
[5] = "cell5",
[6] = "cell6"
}
假设您的 getTotStorage
调用类似于以下内容(您没有 post 它)
getTotStorage(cells)
在循环中,您尝试在 x
上调用一个方法,它是一个字符串值:
for key = 1,6 do
x = table[key]
totStorage = totStorage + x.getMaxEnergyStored()
end
这实际上是在尝试做:
totStorage = totStorage + ("cell1").getMaxEnergyStored()
您可以做的是重新排列您的代码,以便值是 peripheral.wrap
:
返回的对象
local cells = {
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7"),
}
function getTotStorage(t)
local totStorage = 0
for i,v in ipairs(t) do
totStorage = totStorage + v.getMaxEnergyStored()
end
print(totStorage)
end
几点观察:
- 尽可能使用
local
(即totStorage
)来限制变量的范围(不需要将循环计数器作为全局变量)
- 不要命名与标准 Lua 库冲突的变量(即
string
、table
、math
)
ipairs
是遍历序列的更好方法
我正在学习计算机技术 (minecraft) 的编程,但在读取一些存储单元时遇到了一些问题。
我正在处理的函数将遍历所有单元格并将存储容量加在一起到 for 循环中的一个变量。
这是我目前得到的
local cell1 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2")
local cell2 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3")
local cell3 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4")
local cell4 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5")
local cell5 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6")
local cell6 = peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7")
cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"}
local totStorage
function getTotStorage(table)
for key = 1,6 do
x = table[key]
totStorage = totStorage + x.getMaxEnergyStored()
end
print(totStorage)
end
我在这一行遇到错误
totStorage = totStorage + x.getMaxEnergyStored()
说 "Attempt to call nil"。 有什么建议么?
cells = {"cell1", "cell2", "cell3", "cell4", "cell5", "cell6"}
是 shorthand 用于:
cells = {
-- key value
[1] = "cell1",
[2] = "cell2",
[3] = "cell3",
[4] = "cell4",
[5] = "cell5",
[6] = "cell6"
}
假设您的 getTotStorage
调用类似于以下内容(您没有 post 它)
getTotStorage(cells)
在循环中,您尝试在 x
上调用一个方法,它是一个字符串值:
for key = 1,6 do
x = table[key]
totStorage = totStorage + x.getMaxEnergyStored()
end
这实际上是在尝试做:
totStorage = totStorage + ("cell1").getMaxEnergyStored()
您可以做的是重新排列您的代码,以便值是 peripheral.wrap
:
local cells = {
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_2"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_3"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_4"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_5"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_6"),
peripheral.wrap("tile_thermalexpansion_cell_reinforced_name_7"),
}
function getTotStorage(t)
local totStorage = 0
for i,v in ipairs(t) do
totStorage = totStorage + v.getMaxEnergyStored()
end
print(totStorage)
end
几点观察:
- 尽可能使用
local
(即totStorage
)来限制变量的范围(不需要将循环计数器作为全局变量) - 不要命名与标准 Lua 库冲突的变量(即
string
、table
、math
) ipairs
是遍历序列的更好方法