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.
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
@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. –