2010-08-07 23 views
11

Tôi đã đọc về Lua, ngôn ngữ gần như hoàn hảo, nhưng có lỗi nghiêm trọng. Đó là một chỉ mục dựa trên. Tôi cũng đọc nó có một tính năng để thiết lập giá trị tại chỉ số 0, nhưng nó không tính chiều dài bảng và thao tác chuỗi vẫn dựa trên một. Vì vậy, tính năng này là vô nghĩa.Tôi có thể buộc lập chỉ mục bảng của Lua từ số không?

Tôi không muốn nói về một hoặc không dựa trên. Tôi chỉ yêu cầu là có một tính năng buộc phải sử dụng chỉ mục dựa trên zero.

+1

thể tôi chỉ cần hỏi lý do tại sao nó là một vấn đề? Ok, vì vậy bạn thích 0-indexing, nhưng tại sao bạn không thể làm việc với 1-indexing? – gnud

+3

Tôi có vấn đề này quá :) Bất kể những gì làm cho tinh thần tôi nhận được điều này sai trong lua gần như mỗi lần duy nhất. Tôi đã quen với việc làm việc với các ngôn ngữ khác không dựa trên mã lua của tôi có đầy đủ các lỗi do điều này một mình! – jcoder

+0

tôi không nghĩ rằng có một số lá cờ mà sẽ chuyển đổi lua từ 1 đến 0 và như vậy khác hơn sửa đổi lua mà yêu cầu sử dụng một lua phi tiêu chuẩn (i ở đây dub lua0) tôi không thấy làm thế nào nó sẽ được thực hiện –

Trả lời

2

Tôi nghĩ rằng Lua đã có tính năng mà bạn cần để làm cho nó dựa trên 0. Thật không may là tính năng mà tôi gọi là giấy phép nguồn mở của Lua.

Tôi không thể tìm thấy bản vá hoặc bản ngã của Lua đã thay đổi bản chất dựa trên 1 ngôn ngữ.

Thật không may forking Lua thay đổi thành 0 dựa trên cũng sẽ phá vỡ tính tương thích ngược. Mất tất cả các mô-đun bổ trợ hiện tại có thể là một mức giá quá lớn để trả cho việc sử dụng dễ dàng.

+0

Có vẻ như không có cách nào dễ dàng để ghi đè hành vi này. – Eonil

1

Ngay cả khi có một #define TABLE_START_INDEX 1 trong nguồn Lua (mà tôi không tin là có), bạn sẽ khá nhiều tự bắn vào chân bằng cách thay đổi điều này. Điều này là do hầu hết các thư viện sử dụng lập chỉ mục dựa trên 1. Vì vậy, bất kỳ mã nào làm một cái gì đó như sau sẽ phá vỡ.

cho i = 1, #t làm ... cuối

Bạn có thể sử dụng vòng lặp khóa học hoặc thậm chí tạo các hàm trợ giúp để tránh điều này.

chức năng get_first (t) return t [1] cuối

lẽ mặc dù vấn đề thực tế mà bạn đang cố gắng để giải quyết khó hơn thay đổi từ 0 đến lập chỉ mục 1-based.

+3

Không. Nó không phải là một vấn đề thực sự. Vấn đề thực sự là ngôn ngữ cơ sở nên là ngôn ngữ C là ngôn ngữ lập chỉ mục dựa trên 0. Việc trao đổi dữ liệu lập chỉ mục giữa tập lệnh và máy chủ phải được dịch chính xác. Và tôi phải xử lý hệ thống lập chỉ mục kép cùng một lúc. – Eonil

3

Tôi biết câu hỏi này là đã 1 tuổi, nhưng tôi nghĩ rằng những người tìm kiếm tương lai sẽ quan tâm đến một thực tế, rằng CFF Explorer chứa một ngôn ngữ kịch bản (Lua với các bản vá lỗi), trong đó có 0-lập chỉ mục vá bảng:

http://www.ntcore.com/files/cffscriptv2.htm

Ngoài ra, trong các tài liệu trên, tác giả tuyên bố rằng ông đã phải vô hiệu hóa hầu hết các chức năng thư viện chuẩn, bởi vì họ đang không tương thích với mảng 0-lập chỉ mục, vì vậy hãy nhắc lại quá trình suy nghĩ của bạn về vấn đề này :)

1

Nhận xét của Eonil về câu trả lời của ponzao: Vấn đề thực sự là ngôn ngữ cơ sở nên là ngôn ngữ C là ngôn ngữ lập chỉ mục dựa trên 0. Việc trao đổi dữ liệu lập chỉ mục giữa tập lệnh và máy chủ phải được dịch chính xác.

Nếu bạn muốn hiển thị cấu trúc dữ liệu C cho Lua, hãy sử dụng userdata để gói chúng lên. Tuy nhiên, bạn có thể làm cho hành vi lập chỉ mục bạn thích với những thứ này bằng cách sử dụng các metatables. Bằng cách này, bạn có thể đảm bảo bản dịch chính xác.

-1

câu trả lời cho questuion của bạn không, không có cách nào để buộc tất cả quá trình mà lua xử lý với chỉ mục 0, bởi vì ngay bây giờ theo như tôi biết #table đi từ 1, "n" và không có chỉ mục 0 của nó khá vô dụng, ở tầm nhìn của tôi, nhưng phụ thuộc vào những gì bạn muốn làm, bạn có thể so sánh nếu bạn có thứ gì đó hay không, từ bảng, 1 đọc sản phẩm, 1 sản phẩm đọc thu nhập và nếu sản phẩm tăng bạn có nhiều hơn , nếu sản phẩm có = 1 sau đó bạn có con số không, vì vậy bạn chỉ đọc 1 bảng, chứ không phải là 2, tôi hy vọng tôi làm cho tự ngã của tôi rõ ràng <, <

1

cách tiếp cận bẩn với một số nhược điểm:

function zeroIndexed(tbl) 
    local mt = {} 
    mt.data = tbl 
    mt.__index = function(t, k) 
     return mt.data[(type(k) == "number" and k + 1 or k)] 
    end 
    mt.__newindex = function(t, k, v) 
     mt.data[(type(k) == "number" and k + 1 or k)] = v 
    end 
    mt.__len = function() 
     return #mt.data 
    end 
    return setmetatable({}, mt) 
end 
t = zeroIndexed({5, 6, 7}) 
print(t[0], t[1], t[2]) 
t[0] = 4 
print(t[0], #t) 
t[#t] = 8 
print(t[#t - 1], #t) 

Lua 5.2 đầu ra:

5  6  7 
4  3 
8  4 

Trong Lua 5.1 #t lợi nhuận 0__len metamethod không được tôn trọng cho các bảng và chuỗi.

Nhưng hãy nhớ rằng table.insert và các phương pháp bảng khác sẽ không hoạt động ở đây nữa vì việc chèn bây giờ được thực hiện qua t[#t] = x.

Tôi không khuyên bạn nên sử dụng tính năng này.

+0

tại sao bạn không đề xuất? cho vấn đề chèn bảng? –

+0

Điều này có một vấn đề: các cặp lặp và các cặp lặp sẽ vẫn trả về các chỉ mục cho các mảng dựa trên 1. – val

3

Làm việc với mảng 0-lập chỉ mục thực sự là khá đơn giản:

local array={ 
[0]="zero", 
    "one", 
    "two" 
} 

for i=0,#array do 
    print(array[i]) 
end 

Bạn có thể sử dụng #array chưa trừ 1 vì các nhà điều hành thời gian thực sự trả về chỉ số cao nhất (về mặt kỹ thuật, phím trước khi con số không đầu tiên), không thực tế "chiều dài" (mà sẽ không có ý nghĩa trong Lua anyway).

Đối với các nhà khai thác chuỗi, có thể bạn sẽ phải chỉ cần tạo chức năng trùng lặp (mặc dù có thể có một cách tốt hơn)

ipairs() cũng chỉ hỗ trợ 1 lập chỉ mục, nhưng bạn chỉ có thể sử dụng thường xuyên for thay vào đó, mà tôi tìm được dễ đọc hơn anyway:

for _,element in ipairs(array1) do 
    print(element) 
end 
for i=0,#array0 do 
    local element=array0[i] 
    print(element) 
end 
0

Bạn có thể sửa lỗi này lua-lỗ hổng bằng cách sử dụng một iterator đó là ý thức về căn cứ chỉ số khác nhau:

function iarray(a) 
    local n = 0 
    local s = #a 
    if a[0] ~= nil then 
    n = -1 
    end 
    return function() 
    n = n + 1 
    if n <= s then return n,a[n] end 
    end 
end 

Tuy nhiên, bạn vẫn phải bổ sung các yếu tố 0 bằng tay:

Cách sử dụng Ví dụ:

myArray = {1,2,3,4,5} 
myArray[0] = 0 
for _,e in iarray(myArray) do 
    -- do something with element e 
end 
Các vấn đề liên quan