2012-05-14 78 views
5

我正在使用Codea iPad應用程序並學習Lua。 Codea使用Class.lua作爲類。我想要實現的是一種爲變量get和set方法指定函數的方法。目前,變量say「x」可以這樣訪問:print(obj.x)並用這樣的代碼設置:obj.x = 1.我想讓變量調用get和set函數,我可以指定。我正在移植使用Actionscript 3編寫的東西,並且需要模仿A3的get和set函數聲明。讓我知道如果這是可能的或者如果他們是另一種方式。如果添加或更改代碼是解決方案,我可以重寫Codea的Class.lua。謝謝。Lua獲取者和設置者

+0

http://nova-fusion.com/2011/04/04/implementing-proper- gettersetters-in-lua /那只有一個谷歌... – PeterMmm

+0

我已經看了上面的鏈接幾次。我也認爲這是解決方案,但我無法弄清楚如何指定特定變量的get和set函數。 – Spencer

回答

5

您可以通過覆蓋類中的__newindex和__index方法來創建自定義setter和getter。

請注意,您必須修改Codea的一部分LuaSandbox.lua,以啓用rawset和rawget方法(將註釋設置爲零的行註釋掉)。 編輯:在Codea的最新版本中不再是這種情況,默認情況下可以使用rawsetrawget

只要您嘗試設置表中以前未設置的屬性,就會調用__newindex方法。

只要您嘗試獲取表中不存在的屬性,就會調用__index方法。

所以你可以通過在你的類中創建一個私有表並在其中存儲你的成員變量來爲getter和setter插入自定義代碼。當您嘗試讀取和寫入它們時,您可以在__newindex和__index方法中執行自定義代碼。

MyClass = Class() 

function MyClass:init() 
    -- We'll store members in an internal table 
    self.members = {} 
end 

function MyClass:__newindex(index, value) 
    if index == "testMember" then 
     self.members[index] = value 
     print("Set member " .. index .. " to " .. value) 
    else 
     rawset(self, index, value) 
    end 
end 

function MyClass:__index(index) 
    if index == "testMember" then 
     print("Getting " .. index) 
     return self.members[index] 
    else 
     return rawget(self, index) 
    end 
end 

爲了測試它

function setup() 
    foo = MyClass() 

    foo.testMember = 5 
    foo.testMember = 2 

    print(foo.testMember) 
end 

您可以找到有關元方法在這裏的更多信息:http://lua-users.org/wiki/MetamethodsTutorial