Vấn đề của bạn rất đơn giản:
names = {'John', 'Joe', 'Steve'}
for names = 1, 3 do
print (names)
end
Đoạn mã này đầu tiên khai báo một biến toàn cục được gọi names
. Sau đó, bạn bắt đầu một vòng lặp for. Vòng lặp for khai báo một địa phương biến mà chỉ xảy ra được gọi là names
quá; thực tế là một biến đã được xác định trước đó names
là hoàn toàn không liên quan. Bất kỳ việc sử dụng nào names
bên trong vòng lặp for sẽ tham chiếu đến vòng lặp cục bộ , không phải vòng lặp toàn cục.
Vòng lặp for nói rằng phần bên trong của vòng lặp sẽ được gọi với names = 1
, sau đó names = 2
, và cuối cùng names = 3
. Vòng lặp for khai báo một bộ đếm mà đếm từ số đầu tiên đến cuối cùng, và nó sẽ gọi mã bên trong một lần cho mỗi giá trị nó đếm.
Những gì bạn thực sự muốn là một cái gì đó như thế này:
names = {'John', 'Joe', 'Steve'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Cú pháp [] là cách bạn truy cập các thành viên của bảng Lua. Bảng Lua ánh xạ "khóa" thành "giá trị". Mảng của bạn tự động tạo các khóa kiểu số nguyên, các khóa này sẽ tăng lên. Vì vậy, khóa được liên kết với "Joe" trong bảng là 2 (các chỉ số Lua luôn bắt đầu từ 1).
Do đó, bạn cần một vòng lặp for đếm từ 1 đến 3, mà bạn nhận được. Bạn sử dụng biến đếm để truy cập phần tử từ bảng.
Tuy nhiên, điều này có một lỗ hổng. Điều gì xảy ra nếu bạn xóa một trong các phần tử khỏi danh sách?
names = {'John', 'Joe'}
for nameCount = 1, 3 do
print (names[nameCount])
end
Bây giờ, chúng tôi nhận được John Joe nil
, vì cố gắng truy cập các giá trị từ một bảng không tồn tại dẫn đến kết quả nil
. Để tránh điều này, chúng ta cần đếm từ 1 đến chiều dài của bảng:
names = {'John', 'Joe'}
for nameCount = 1, #names do
print (names[nameCount])
end
Là #
toán tử độ dài. Nó hoạt động trên các bảng và chuỗi, trả về độ dài của một trong hai. Bây giờ, bất kể lớn hay nhỏ names
, điều này sẽ luôn hoạt động.
Tuy nhiên, có một cách thuận tiện hơn để lặp qua một mảng các mục:
names = {'John', 'Joe', 'Steve'}
for i, name in ipairs(names) do
print (name)
end
ipairs
là một hàm tiêu chuẩn Lua lặp qua một danh sách. Kiểu for
vòng lặp này, vòng lặp for vòng lặp, sử dụng loại chức năng trình vòng lặp này. Các i
giá trị là chỉ số của các mục trong mảng. Các name
giá trị là giá trị tại chỉ mục đó. Vì vậy, về cơ bản nó làm rất nhiều việc cho bạn.