2013-01-02 46 views
5

Tôi đang cố gắng thay đổi ví dụ về lớp mà tôi đã tìm thấy trong this video để làm cho nó được sắp xếp hợp lý hơn một chút để sử dụng. Hy vọng rằng ý kiến ​​của tôi giải thích những gì tôi đang cố gắng để đạt được đủ tốt. Vấn đề tôi gặp phải là khi tôi cố gắng sử dụng bảng dữ liệu, nó cho tôi lỗi này: lua: class example.lua: 7: cố gắng lập chỉ mục trường 'dữ liệu' (giá trị nil)Truyền mảng như tham số hàm trong Lua?

Tôi giả định rằng điều này có nghĩa là mảng không được truyền vào đúng chức năng, nhưng tôi không biết tại sao. Tôi là một người mới bắt đầu với Lua.

Đây là những gì tôi đã có:

local enemy = {}; --enemy class table 

function enemy:New(data) 
    local object = {}; --table to store all of data within class 
    local len = # data --get length of passed table 
    for i = 1, len, 2 do --loop to input all data from passed table into object table 
    object.data[i] = data[i + 1]; 
    end 

    function object:getData(choice) --function that allows us to retrieve data from the class 
    return self[choice]; 
    end 

    return object; --return class data table so we can create objects using the class 
end 

local monsterdata = {"name", "monster", "x", 64, "y", 128, "hp", 4}; --table containing data of monster. keys are odd numbered, values to those keys are even numbered 
local monster = enemy:New(monsterdata); --create a object using the class 

local test = monster:getData("x"); --set variable to a value with the getData function 

print(test); 

Trả lời

4

Nếu bạn muốn object để giữ dữ liệu, bạn có thể có nghĩa là để viết

object[data[i]] = data[i + 1]; 

thay vì

object.data[i] = data[i + 1]; 

Việc làm này kết quả in là 64.

+0

Ah, đó là một sai lầm đơn giản ... mặc dù tôi cho rằng đó thường là trường hợp. –

+0

Có, và không phải là không phổ biến. Việc gõ 't.a' thay vì' t [a] 'xảy ra với tôi theo thời gian. – mkluwe

5

Bạn đã không tạo ra các bảng object.data - mỗi bảng trong Lua cần phải được khởi tạo:

local object = {} 
local object.data = {} 

hoặc

local object = { data = {} } 

Tuy nhiên, ví dụ của bạn sẽ không hoạt động theo cách dự định, trừ khi bạn sửa hàm getData:

function object:getData(choice) 
    return self.data[choice] 
end 

Cuối cùng, đây là Lua, vì vậy bạn không cần bất kỳ ; trong mã của mình: P.

+0

Haha, tôi biết; không cần thiết, tôi chỉ mới bắt đầu lập trình với C, và giáo viên của tôi rất nghiêm khắc về những điều này, vì vậy nó an ủi khi có chúng. : P –

+0

Những gì tôi đã làm để bắt đầu với công trình (trừ đi những sai lầm ngu ngốc mà tôi đã làm mà mkluwe chỉ ra) với ít mã hơn điều này, và không cần phải lưu bảng dữ liệu lần thứ hai. Có lý do gì mà tôi nên làm theo cách này theo cách khác không? –

2

Giống như những người khác đã nói, object.data cần được khởi chạy và có lỗ hổng trong vòng lặp forgetData. Ngoài ra, trong khi nó không phải là một lỗi chính xác, hệ thống của bạn đi qua các phím như lẻ và giá trị thậm chí là một cách rất tốt để làm điều đó trong một ngôn ngữ dựa trên C, không có kết hợp mảng/từ điển/bảng literals, nhưng trong Lua, thành ngữ là

{keyname = value, keyname = value, ...}

và nếu bàn kéo dài nhiều dòng

{ 
    keyname = value; 
    keyname = value; 
    keyname = value; 
    ... 
} 

Vì vậy, trong trường hợp của bạn, monsterdata chỉ đơn giản có thể là

{ 
    name = "monster"; 
    x = 64; 
    y = 128; 
    hp = 4; 
} 

và bạn có thể xóa vòng lặp for hoàn toàn

lưu ý: bạn chỉ có thể trình bày các phím chuỗi theo cách này. Đối với các loại khóa khác, như số, booleans hoặc thậm chí là chức năng và các bảng khác, hãy bao quanh khóa trong các dấu ngoặc vuông [].Ví dụ, nếu bạn muốn có một bảng mynot, để ánh xạ dữ liệu boolean để đối lập của họ, bạn có thể sử dụng:

{ 
    [true] = false; 
    [false] = true; 
} 

hoặc, nếu bạn muốn để ánh xạ một tập hợp các chức năng để libaries họ

{ 
    [print] = "standard"; 
    [os.execute] = "standard os"; 
    [math.sin] = "standard math"; 
    [function() print "a user function" end] = "me!"; 
} 

tôi nghĩ rằng bạn càng tìm hiểu về Lua càng nhiều bạn sẽ thích nó. Nó thực sự là một ngôn ngữ tuyệt vời, với rất nhiều tính năng thú vị. Chúc mừng mã hóa!

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