2011-09-30 22 views
57

我的任務是如何做一個for循環。我從數字的角度弄清楚了這一點,但是不能用名字來解釋它。我想創建一個按照名稱列表運行的for循環。以下是我迄今爲止:For Lu Lua

names = {'John', 'Joe', 'Steve'} 
for names = 1, 3 do 
    print (names) 
end 

我已經嘗試了一些其他的東西,但它只是不工作,終端永遠只是列出了1,2,3 ...我做錯了嗎?

回答

144

你的問題很簡單:

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值是該索引處的值。所以它基本上爲你做了很多努力工作。

+4

偉大的答案,不僅解決問題,但解釋如何改善它。 – ChrisO

+0

因此,對於使用ipairs()作爲foreach()在其他語言中使用 – boctulus

+4

好的答案,我只是補充說,在最後一個例子中,當var未使用時,通常使用'_'。例如(姓名) print(name) end' – Fraser

11

通過在線閱讀(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 
+5

你讀表教程,但你沒有看到'ipairs'?或者'pair'不需要按特定順序返回鍵值的部分? –

+0

我實際上首先使用了'ipairs',但是當我添加'myKey =「myValue」''這個非數字鍵需要'pairs'的例子時,我決定改變'pairs'的其餘部分。如果我遺漏了訂單不能保證訂單,我很遺憾,但是我將鏈接留在那裏供他閱讀。 – derp

-1
names = {'John', 'Joe', 'Steve'} 
for names = 1, 3 do 
    print (names) 
end 
  1. 你刪除你的表,並與一個int
  2. 取代它你是不是從表中拉值

嘗試:

names = {'John','Joe','Steve'} 
for i = 1,3 do 
    print(names[i]) 
end 
+0

Downvoter:請提供一個*有效的* downvoting原因。儘管我認爲答案是誤導,因爲'for'作用域中聲明的'names'(整數計數器)引入了一個局部變量,該局部變量將在全局作用域中聲明的'names'(表數組)隱藏。 – Dejavu