我的任務是如何做一個for循環。我從數字的角度弄清楚了這一點,但是不能用名字來解釋它。我想創建一個按照名稱列表運行的for循環。以下是我迄今爲止:For Lu Lua
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
我已經嘗試了一些其他的東西,但它只是不工作,終端永遠只是列出了1,2,3 ...我做錯了嗎?
我的任務是如何做一個for循環。我從數字的角度弄清楚了這一點,但是不能用名字來解釋它。我想創建一個按照名稱列表運行的for循環。以下是我迄今爲止:For Lu Lua
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
我已經嘗試了一些其他的東西,但它只是不工作,終端永遠只是列出了1,2,3 ...我做錯了嗎?
你的問題很簡單:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
此代碼首先聲明瞭一個名爲names
全局變量。然後,你開始一個for循環。 for循環聲明瞭一個本地變量,它恰好也被稱爲names
;變量先前已被定義爲names
的事實完全不相關。 for循環內的任何names
的使用將參考本地之一,而不是全球之一。
for循環表示循環的內部將被調用names = 1
,然後names = 2
,最後調用names = 3
。 for循環聲明瞭一個計數器,它從第一個數字到最後一個數字進行計數,並且它會爲每個計數值調用一次內部代碼。
你其實想什麼是這樣的:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
的[]語法是你如何訪問一個Lua表的成員。 Lua表將「鍵」映射爲「值」。你的數組自動創建整數類型的鍵,這會增加。所以與表格中「Joe」相關的鍵是2(Lua索引總是從1開始)。
因此,您需要一個for循環,從1到3計數,您會得到。您可以使用count變量來訪問表中的元素。
但是,這有一個缺陷。如果從列表中刪除某個元素會發生什麼?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
現在,我們得到了John Joe nil
,因爲試圖從沒有在nil
存在結果的表訪問值。爲了防止這種情況,我們需要從表1至長度數:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
的#
是長度操作。它適用於表和字符串,並返回任意一個的長度。現在,無論多大或小names
獲得,這將始終工作。
然而,存在一個通過項目的數組來迭代更方便的方法:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
是一個Lua標準函數,在一個列表上進行迭代。循環迭代器for
的這種樣式使用這種迭代器函數。 i
值是數組中條目的索引。 name
值是該索引處的值。所以它基本上爲你做了很多努力工作。
通過在線閱讀(tables tutorial)似乎錶行爲像數組,所以你正在尋找:
WAY1
names = {'John', 'Joe', 'Steve'}
for i = 1,3 do print(names[i]) end
Way2
names = {'John', 'Joe', 'Steve'}
for k,v in pairs(names) do print(v) end
WAY1使用表index/key
,你的桌子上names
每個元素都有一個從1開始的關鍵,例如:
names = {'John', 'Joe', 'Steve'}
print(names[1]) -- prints John
所以你只要把i
從1到3
在Way2,而不是你指定要運行並分配一個變量的鍵和值,例如什麼表:
names = {'John', 'Joe', myKey="myValue" }
for k,v in pairs(names) do print(k,v) end
打印如下:
1 John
2 Joe
myKey myValue
你讀表教程,但你沒有看到'ipairs'?或者'pair'不需要按特定順序返回鍵值的部分? –
我實際上首先使用了'ipairs',但是當我添加'myKey =「myValue」''這個非數字鍵需要'pairs'的例子時,我決定改變'pairs'的其餘部分。如果我遺漏了訂單不能保證訂單,我很遺憾,但是我將鏈接留在那裏供他閱讀。 – derp
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
嘗試:
names = {'John','Joe','Steve'}
for i = 1,3 do
print(names[i])
end
Downvoter:請提供一個*有效的* downvoting原因。儘管我認爲答案是誤導,因爲'for'作用域中聲明的'names'(整數計數器)引入了一個局部變量,該局部變量將在全局作用域中聲明的'names'(表數組)隱藏。 – Dejavu
偉大的答案,不僅解決問題,但解釋如何改善它。 – ChrisO
因此,對於使用ipairs()作爲foreach()在其他語言中使用 – boctulus
好的答案,我只是補充說,在最後一個例子中,當var未使用時,通常使用'_'。例如(姓名) print(name) end' – Fraser