2013-10-13 117 views
5

我正在尋找lua中的庫/函數,它允許您使用自定義變量類型(甚至可以使用「類型」方法將其檢測爲自定義類型)。我正在嘗試製作一個具有自定義類型「json」的json編碼器/解碼器。我想要一個可以在盧阿獨自完成的解決方案。自定義變量類型Lua

回答

9

您不能創建新的Lua類型,但可以使用元表和表來模仿他們的創建。例如:

local frobnicator_metatable = {} 
frobnicator_metatable.__index = frobnicator_metatable 

function frobnicator_metatable.ToString(self) 
    return "Frobnicator object\n" 
     .. " field1 = " .. tostring(self.field1) .. "\n" 
     .. " field2 = " .. tostring(self.field2) 
end 


local function NewFrobnicator(arg1, arg2) 
    local obj = { field1 = arg1, field2 = arg2 } 
    return setmetatable(obj, frobnicator_metatable) 
end 

local original_type = type -- saves `type` function 
-- monkey patch type function 
type = function(obj) 
    local otype = original_type(obj) 
    if otype == "table" and getmetatable(obj) == frobnicator_metatable then 
     return "frobnicator" 
    end 
    return otype 
end 

local x = NewFrobnicator() 
local y = NewFrobnicator(1, "hello") 

print(x) 
print(y) 
print("----") 
print("The type of x is: " .. type(x)) 
print("The type of y is: " .. type(y)) 
print("----") 
print(x:ToString()) 
print(y:ToString()) 
print("----") 
print(type("hello!")) -- just to see it works as usual 
print(type({})) -- just to see it works as usual 

輸出:

 
table: 004649D0 
table: 004649F8 
---- 
The type of x is: frobnicator 
The type of y is: frobnicator 
---- 
Frobnicator object 
    field1 = nil 
    field2 = nil 
Frobnicator object 
    field1 = 1 
    field2 = hello 
---- 
string 
table 

當然的例子是簡單和有更多的東西,說Lua中面向對象的編程。您可能會發現以下參考有用:

+0

對於你的type()函數,我通常在描述classname的metatable中實現一個__type字段。然後type對於所有類都將是一個有用的值。 – Zeksie

+0

@Zeksie是的,這絕對是一種選擇。正如我所說,在Lua中有更多關於OOP的說法。 –

+0

您可以製作一個可以製作自定義變量類型的函數嗎?例如:'jsonCode = {「json text here」} varType(jsonCode,「json」)'會簡單地用'json''自定義類型返回'jsonCode'。 'tostring(jsonCode)'只會返回'jsonCode [1]'(在這種情況下,它將等於'「json text here」')。不用費心去實現你在這裏的2值系統,我只會在具有1值的表格中使用它。 – tupperkion

5

你所要求的是不可能的,甚至不用C API。在Lua中只有內建類型,沒有辦法增加更多。然而,使用metamethods和表格可以製作(函數創建)表格,它們可以在非常接近的地方靠近其他語言的自定義類型/類別。例如,請參閱Programming in Lua: Object-Oriented Programming(但請記住,本書是爲Lua 5.0編寫的,因此某些細節可能已更改)。