2013-06-26 19 views
5

Tôi bắt đầu học lập trình dựa trên Prototype tại Lua. Tôi tự hỏi những gì đang sử dụng metatables mà không metamethods. Có một dòng ở ví dụ dưới đây tự .__ index = tự khi tôi xóa dòng này somevalue không hiển thị trong đối tượng mới của tôi, điều này là bình thường vì tôi không sử dụng metamethod __index. Vậy thì việc sử dụng metatables là gì - chỉ sử dụng metamethods? Xin lỗi cho câu hỏi tầm thường nhưng điều này thực sự thú vị, tôi biết tôi có thể sử dụng getmetatable để kiểm tra metatable của một số đối tượng. Tôi cần câu trả lời đơn giản: Không có sử dụng mà không có metamethods hoặc có (nếu có thì những gì).Whats việc sử dụng metatables mà không metamethods?

-- Example taken from the official documentation. 
Account = { somevalue = 1 } 

function Account:new (o) 
    o = o or {} -- create object if user does not provide one 
    setmetatable(o, self) 
    --self.__index = self 
    return o 
end 

a = Account:new() 
print(a.somevalue) -- nil, so I can't use any features of the metatable till I use some metamethod? 

Trả lời

4

Theo định nghĩa, metatables lưu trữ metamethods. Điều này không có nghĩa là một metatable phải lưu trữ chỉ metamethods; một số thư viện sử dụng chúng như là metatables.

Một metatable là một bảng Lua bình thường. Nó chỉ trở thành metatable của một đối tượng khi bạn gọi setmetatable với nó như là đối số thứ hai của nó.

1

Vâng, vâng, metatables lưu trữ metamethods của đối tượng và đó là những gì chúng được sử dụng, ít nhất là tôi chưa thấy bất kỳ ứng dụng nào khác.

3

Bạn cũng có thể làm cho các phím hoặc các giá trị hoặc cả hai yếu với __mode chính metatable, trong đó có một giá trị chuỗi và không phải là một chức năng (phương pháp)

Hầu hết metamethods được giải thích ở đây:

Một số hàm API Lua cũng kiểm tra các phương pháp meta cụ thể, như

  • __pairs - cho cặp()
  • __ipairs - cho ipairs()
  • __tostring - gọi bằng các toString() chức năng
  • __gc - cho thu gom rác thải
  • __metatable - đọc bởi các thiết lập/chức năng getmetatable (cũng là một giá trị)

Nếu bạn tìm kiếm tệp manual cho tên cụ thể bao gồm __ bạn sẽ tìm thấy t ông định nghĩa đầy đủ và giải thích, không sử dụng lặp lại nó ở đây.

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