2009-03-26 42 views
10

Nếu dấu ngoặc nhọn ('{' và '}') được sử dụng trong Lua, chúng được sử dụng để làm gì?Dấu ngoặc nhọn có được sử dụng trong Lua không?

+1

tôi rất tò mò về việc thêm một tiền xử lý đơn giản để thay thế chúng với "làm/sau đó" và "kết thúc" để làm cho nó ít tiết hơn một chút. – Sydius

+0

Hãy xem bộ lọc mã thông báo và metalua, cả hai được tham chiếu thường xuyên trong danh sách gửi thư Lua-L được tìm thấy tại www.lua.org. Cả hai đều cung cấp các cách để sửa đổi ngôn ngữ ở cấp cây cú pháp trừu tượng và có thể thực hiện điều này. Một preprocessor sẽ cần phải làm rất nhiều phân tích cú pháp để làm cho nó đúng. – RBerteig

Trả lời

33

Bảng chữ.

Bảng là loại trung tâm trong Lua và có thể được coi là mảng kết hợp (bảng băm hoặc từ điển) hoặc dưới dạng mảng thông thường. Các khóa có thể là giá trị của bất kỳ loại Lua nào ngoại trừ nil và các thành phần của bảng có thể chứa bất kỳ giá trị nào trừ số nil.

Truy cập thành viên mảng được thực hiện hiệu quả hơn truy cập khóa băm phía sau hậu trường, nhưng chi tiết thường không quan trọng. Điều đó thực sự làm cho việc xử lý các mảng thưa thớt có ích vì lưu trữ chỉ cần được cấp phát cho những ô có chứa một giá trị nào đó.

Điều này dẫn đến thành phần mảng dựa trên 1 phổ quát cảm thấy hơi lạ đối với lập trình viên C.

Ví dụ

a = { 1, 2, 3 } 

tạo một mảng lưu trữ trong biến a với ba yếu tố (tình cờ) có giá trị tương tự như chỉ số của họ. Bởi vì các yếu tố được lưu trữ tại các chỉ số tuần tự bắt đầu với 1, chiều dài của a (do #a hoặc table.getn(a)) là 3.

Khởi tạo một bảng với các phím không số nguyên có thể được thực hiện như thế này:

b = { one=1, pi=3.14, ["half pi"]=1.57, [function() return 17 end]=42 } 

trong đó b sẽ có các mục có tên "một", "pi", "half pi" và chức năng ẩn danh. Tất nhiên, tìm kiếm phần tử cuối cùng mà không lặp lại bảng có thể khó khăn trừ khi một bản sao của hàm đó được lưu trữ trong một số biến khác.

Một nơi khác mà dấu ngoặc nhọn xuất hiện thực sự là ý nghĩa ngữ nghĩa tương tự, nhưng nó được che giấu (đối với người dùng mới của Lua) đằng sau một số cú pháp đường. Việc viết các hàm có một đối số duy nhất là một bảng. Trong trường hợp đó, việc gọi hàm không yêu cầu sử dụng dấu ngoặc đơn. Điều này dẫn đến mã dường như chứa một kết hợp của (){} cả hai dường như được sử dụng như một toán tử cuộc gọi hàm.

btn = iup.button{title="ok"} 

tương đương với

btn = iup.button({title="ok"}) 

nhưng cũng ít khó khăn trên con mắt. Ngẫu nhiên, việc gọi một hàm đối số đơn lẻ với một giá trị bằng chữ cũng hoạt động đối với các chuỗi ký tự.

4

danh sách/phương thức khởi tạo ditionary (nghĩa là hàm tạo bảng).

Chúng không được sử dụng cho các khối mã nếu đó là ý của bạn. Cho rằng Lua chỉ sử dụng từ khóa kết thúc để kết thúc khối.

See here

+0

Ah, phải rồi, bây giờ tôi cảm thấy ngớ ngẩn. – Sydius

+0

Không có danh sách hoặc từ điển nào trong Lua, nhưng có một loại "bảng" phục vụ cả hai. Các dấu ngoặc nhọn được sử dụng như một hàm tạo bảng. –

+0

@Alexander Gladysh: Cảm ơn, tôi đã điều chỉnh câu trả lời của mình. –

1

Họ đang sử dụng cho literals bảng như bạn sẽ sử dụng trong C:

t = {'a', 'b', 'c'} 

Đó là trường hợp phổ biến mà thôi. Chúng không được sử dụng cho các dấu phân tách khối.Trong một bảng lua, bạn có thể đặt các giá trị của các loại khác nhau:

t={"foo", 'b', 3} 

Bạn cũng có thể sử dụng chúng như dictionnaries, à la Python:

t={name="foo", age=32} 
Các vấn đề liên quan