2013-10-17 33 views
0

我正在使用Corona SDK。 我想寫接收組件作爲參數,並刪除它像一個功能:如何在Corona中通過引用傳遞變量

function removeComponent(component) 
    if component then component:removeSelf() end 
    component = nil 
end 

那麼,它的工作原理,但使用此功能後,我的參數沒有得到零。可能我必須通過參考來傳遞它,但我不確定Corona是否可能。

回答

0

的Lua不支持通過引用傳遞,但由於它不支持返回值可以隨時實現你想要使用這是什麼慣用做法:

function removeComponent(component) 
    if component then component:removeSelf() end 
    return nil 
end 

然後調用它像這樣:

a = removeComponent(a) 

編輯:值得指出過,由於Lua中支持多個返回值和多任務,你從來沒有真正需要傳遞通過引用。如果您需要更新多個項目,請將它們傳回並返回,然後執行以下呼叫: a,b = myFunction(a,b)

+1

爲一個想法。 – Misha

3

這在你的例子中沒有提到。

你究竟想完成什麼?組件是全球性的嗎?或者表中的鑰匙?

在你的例子中,component是函數中局部變量的名稱。您的component = nil只會從本地變量中刪除該值,因此將會丟失。

如果你想有全球性的影響,你需要通過名的變量你想要消除的字符串:

function removeComponent(component) 
    if _G[component] then -- exists globally? 
     _G[component]:removeSelf() 
    end 
    _G[component] = nil 
end 

注意,使用這種編程風格(在這種東西的全球表)通常不是一個好主意。在最好的情況下,它可以讓你感到驚訝,在最糟糕的情況下,你最終將像標準功能那樣的東西打印出來。

因此,我建議puttign東西在自己的表中,並將其傳遞給函數。

0

它與其他語言沒有什麼不同。通過引用傳遞值(例如,在C++中)不會阻止任何程序在其他地方持有另一個相同值的副本。

我對Corona一無所知,但這並不是一個真正的電暈問題,而是一個Lua風格的問題。但是,如果我寫了它,我會確保'組件'用戶數據或基礎值會自行清除。如果用戶數據被再次訪問,它應該拋出一個錯誤,抱怨重新使用一個死的用戶數據。

0

我寫了這個代碼:

local component = display.newCircle(100, 100, 100); 

local function removeComponent(c) 
    if component then component:removeSelf() end 
    component = nil 
end 

removeComponent(component) 
if component == nil then print("Component is nil") else print("Component is not nil") end 

而且它打印 「分量是零​​」。也許你有一些你的組件的副本,或者你可能忘記調用removeComponent或其他東西。需要看到更多的代碼的

+1

您刪除全局「組件」而不是傳遞變量「c」 – Misha