如何扩展Lua库以访问它的本地函数?

时间:2014-07-03 23:15:56

标签: lua corona extension-methods

如何在Lua中扩展库以便:

  • 请勿触摸您正在展开的文件
  • 想要在课程中添加另一种方法
  • 希望拥有自己的库类自定义名称(即不只是“M”)
  • KEY:您可以添加的功能可以访问库的本地功能。所以就好像你把这个函数直接放到了第三方库中,但实际上它不是,你把它分成另一个文件(你自己的)来避免库文件更新时的问题
  • 获取您的信息:在这种情况下使用Corona SDK

以下示例:此处出现错误:“尝试调用全局'getANumber'(零值)”。在方法方面,任何更好的方法都会受到欢迎。

main.lua

local myLibrary = require("library")
local myLibraryExtension = require("myLibraryExtension")
myLibraryExtension:extend(myLibrary)

myLibrary:doX()
myLibrary:doY()   -- <=== ERROR HERE

library.lua

local M = {}

local function getANumber()
    return 55
end

function M:doX()
    print("X", getANumber())
end

return M

myLibraryExtension.lua

local M = {}

local function doY()
    print("X", getANumber())
end

function M:extend(sourceClass)
    sourceClass.doY = doY
end

return M

1 个答案:

答案 0 :(得分:2)

无法调用getANumber文件中的myLibraryExtension.lua功能。本地函数仅存在于library.lua范围内,并且无法在外部使用,原因如in comments by hugomg所述。如果您想要访问私人(读取 local )功能,您可以修改如下脚本:

library.lua

return M

之前添加以下语句
M.getANumber = getANumber

myLibraryExtension.lua

稍微修改一下doY函数:

local function doY(this)
    print("X", this.getANumber())
end

当您执行语句

时会发生什么
myLibrary:doY()

lua按如下方式执行:

myLibrary.doY( myLibrary ) -- yes, myLibrary is passed as an argument too

您可以通过扩展doY函数来接受参数(在我的情况下为this),以便使用传递给库的参考。

然后,该对象可以访问所需的本地函数。