2010-07-05 79 views
1

Ruby有這個非常有趣的功能,當你用'Class.new'創建一個類並將其賦值爲一個常量(大寫)時,語言「神奇地」設置類的名稱它匹配常量。lua - 捕獲變量賦值

# This is ruby code 
MyRubyClass = Class.new(SuperClass) 
puts MyRubyClass.name # "MyRubyClass" 

似乎ruby「捕獲」了賦值,並在匿名類中插入了名字。

我想知道是否有辦法在Lua中做類似的事情。

我實現我自己的類系統,但它的工作我必須兩次指定同一個名字:

-- This is Lua code 
MyLuaClass = class('MyLuaClass', SuperClass) 
print(MyLuaClass.name) -- MyLuaClass 

我想擺脫'MyLuaClass'字符串。有沒有辦法在Lua中做到這一點?

回答

4

當分配給全局變量時,您可以爲全局變量表設置一個__newindex元方法來捕獲類變量的賦值並執行任何所需的操作。

+0

這看起來可能,但效率不高;每次完成全局任務時,我都必須調用lua函數;如果將全球任務保持在最低限度,這可能不是什麼大問題。我會試一試,謝謝你的提示。 – kikito 2010-07-06 06:36:38

+5

調用Lua函數的代價並不是很大。如果您有性能問題,請轉到C或使用LuaJIT。一些函數調用,特別是在這種設置工作中,可以忽略不計。 – Puppy 2010-07-06 09:45:20

+0

這是最好的方法。謝謝! – kikito 2010-07-11 22:14:13

2

可以消除的提到的MyLuaClass一個...

> function class(name,superclass) _G[name] = {superclass=superclass} end 
> class('MyLuaClass',33) 
> =MyLuaClass 
table: 0x10010b900 
> =MyLuaClass.superclass 
33 
> 
+0

這是我的第一個想法之一。另一個是在類(這將是一個表)上使用__index方法 - 所以它會像這樣:class.MyLuaClass(s​​uperclass)。但是我真的很想知道分配捕獲,如果可能的話。爲你的努力+1。 – kikito 2010-07-06 06:31:13

0

不是真的。 Lua不是面向對象的語言。它有時可以表現得像一個人。但每次都很遠。在Lua中,類不是特殊的值。一張桌子有你放入的價值,不再有。你可以做的最好的是從類函數中手工設置_G中的鍵,並且不必取回返值。我想,如果它真的,真的困擾你,你可以使用debug.traceback(),獲取堆棧跟蹤,找到調用文件,並解析它找到變量名稱。然後設置。但這不僅僅是一點小題大做。

+0

我不想讓Lua每次都像一個面向對象的語言。如果我給你這種印象,我很抱歉。我只是想知道如何捕捉作業。我會繼續搜索。 – kikito 2010-07-06 06:44:06

+0

@egarcia:你無法捕捉任務。 Lua沒有分配的元表項。分配到一個表中,是的。一般作業,沒有。 – Puppy 2010-07-06 09:43:13

0

至少到Lua 5.2尊重:您可以捕獲分配到A)一個Lua國家的全局表,如在前面的回覆,還B)到任何其他的Lua對象,其__index和__newindex元方法提及已被替換(通過替換元表),我可以確認,因爲我目前正在使用這兩種技術將Lua腳本所做的分配掛鉤並重定向到外部C/C++資源管理。 雖然有關於閱讀它們的問題,但訣竅是不要讓這些值設置在Lua狀態。 只要它們存在,你的鉤子就不會被調用,所以如果你想要沿着這條路徑走下去,你需要捕獲所有的獲取/設置嘗試,並且永遠不要將值存儲在Lua狀態中。