2012-10-26 37 views
15

Nói rằng tôi có một bảng được định nghĩa như thế này:"Đối với mỗi" vòng lặp trong một bảng lua với các cặp giá trị key

myTable = { myValue = nil, myOtherValue = nil}

Làm thế nào tôi sẽ lặp qua nó trong một cho mỗi vòng lặp thời trang như thế này?

for key,value in myTable do --pseudocode 
     value = "foobar" 
    end 

Ngoài ra, nếu nó giúp, tôi không thực sự quan tâm đến khóa, chỉ là giá trị.

Trả lời

37

Các khóa không có giá trị (ví dụ: nil) không tồn tại. myTable là một bảng trống xa như Lua có liên quan.

Bạn có thể lặp qua một bảng trống, nhưng điều đó sẽ không hữu ích.

Hơn nữa:

for key,value in myTable do --pseudocode 
    value = "foobar" 
end 

này "giả" làm cho không có ý nghĩa. Bạn không thể sửa đổi một bảng bằng cách sửa đổi nội dung của một biến cục bộ; Lua không làm việc theo cách đó. Bạn không thể có được một tham chiếu đến một mục bảng; bạn chỉ có thể nhận được giá trị từ bảng.

Nếu bạn muốn sửa đổi nội dung của bảng, bạn phải thực sự sửa đổi bảng. Ví dụ:

for key,value in pairs(myTable) do --actualcode 
    myTable[key] = "foobar" 
end 

Lưu ý việc sử dụng myTable. Bạn không thể sửa đổi một bảng mà không sử dụng chính bảng tại một số điểm. Cho dù đó là bảng được truy cập thông qua myTable hoặc thông qua một số biến khác, bạn lưu trữ tham chiếu đến bảng.

Nói chung, việc sửa đổi bảng trong khi nó lặp qua nó có thể gây ra sự cố. Tuy nhiên, Lua nói:

Hành vi của next không xác định nếu, trong quá trình truyền tải, bạn chỉ định bất kỳ giá trị nào cho trường không tồn tại trong bảng. Tuy nhiên, bạn có thể sửa đổi các trường hiện có. Đặc biệt, bạn có thể xóa các trường hiện có.

Vì vậy, nó hoàn toàn hợp lệ để sửa đổi giá trị của trường đã tồn tại. Và key rõ ràng đã tồn tại trong bảng, vì vậy bạn có thể sửa đổi nó. Bạn thậm chí có thể đặt nó thành nil mà không có vấn đề gì.

Các biến trong Lua không là gì hơn so với giá trị của các giá trị. Bảng chứa các giá trị; myTable[key] trả về một giá trị. Bạn có thể lưu trữ giá trị đó trong một biến, nhưng việc thay đổi biến sẽ không thay đổi giá trị của myTable[key]. Vì các bảng được lưu trữ theo tham chiếu, bạn có thể thay đổi nội dung của bảng trong một biến và xem các thay đổi trong biến khác, nhưng đó chỉ đơn giản là nội dung của bảng chứ không phải bảng.

+8

Tôi sẽ thêm rằng sửa đổi một bảng trong cùng một vòng lặp mà bạn đang sử dụng để phân tích cú pháp với cặp được coi là "hành vi không xác định" trong Lua. Nó có thể làm việc trong một Lua thực hiện, nhưng không phải trên khác. Có các lựa chọn thay thế an toàn hơn, như sử dụng một bảng phụ trợ để lưu ý những thay đổi và sau đó phân tích nó để áp dụng chúng. – kikito

+4

@kikito: Không phải trong trường hợp này. Tôi đã cập nhật bài đăng để giải thích. –

Các vấn đề liên quan