Chức năng này dường như đóng vai trò cung cấp một biến thể của OOP trong Lua (một chút cẩu thả trong quan điểm của tôi).
Đây là nhà máy của một lớp học.
Nó có thể được viết lại như sau, cho rõ ràng:
C = { }
C.foo = function(self) -- just some method, so class would not be empty
print("foo method called", tostring(self))
end
C.__index = C -- (A)
function newInstance(class)
return setmetatable({ }, class) -- (B)
end
Bây giờ nếu chúng ta tạo ra hai trường hợp mới của C, chúng ta thấy rõ rằng cả hai đều có một foo() phương pháp, nhưng tự khác nhau:
o1 = newInstance(C)
o1:foo() --> foo method called table: 0x7fb3ea408ce0
o2 = newInstance(C)
o2:foo() --> foo method called table: 0x7fb3ea4072f0
các phương pháp foo đều giống nhau:
print(o1.foo, o2.foo, o1.foo == o2.foo and "equal" or "different")
--> function: 0x7fb3ea410760 function: 0x7fb3ea410760 equal
Điều này là do bảng C (các "lớp") là một __index
((A)
ở trên) của metatable của o1
và o2
, được đặt trong (B)
. Nhưng o1
và o2
thực sự là hai bảng khác nhau, được tạo tại (B)
("phiên bản lớp" hoặc "đối tượng").
Lưu ý: chúng tôi đặt C.__index
bằng C
chính nó tại (A)
vì vậy chúng tôi sẽ sử dụng lại một bảng. Sau đây có tác dụng tương tự:
prototype = { }
prototype.foo = function(self) -- just some method, so class would not be empty
print("foo method called", tostring(self))
end
C = { __index = prototype }
function newInstance(class)
return setmetatable({ }, class)
end
o = newInstance(C)
Nguồn
2012-03-08 12:59:36
Xin vui lòng ai đưa ra một tiêu đề tốt hơn cho câu hỏi này vì tôi nghĩ rằng nó sẽ giúp số nhà phát triển ra khỏi đó. – chchrist