如何通过访问扩展Lua库';什么是本地功能?

如何通过访问扩展Lua库';什么是本地功能?,lua,coronasdk,extension-methods,Lua,Coronasdk,Extension Methods,如何在Lua中扩展库,以便: 不要触摸正在扩展的文件 要向类添加另一个方法吗 希望为库类拥有自己的自定义名称(即,不只是“M”) 键:使您添加的函数能够访问库的本地函数。因此,就好像您将函数直接放入第三方库中一样,但事实并非如此,您已将其分离到另一个文件(您自己的)中,以避免库文件更新时出现问题 仅供参考:在本例中使用Corona SDK 下面的示例:这里有一个错误:“尝试调用全局‘getANumber’(一个nil值)”。在方法上,任何更好的方法都受到欢迎 梅因·卢阿 local myLi

如何在Lua中扩展库,以便:

  • 不要触摸正在扩展的文件
  • 要向类添加另一个方法吗
  • 希望为库类拥有自己的自定义名称(即,不只是“M”)
  • 键:使您添加的函数能够访问库的本地函数。因此,就好像您将函数直接放入第三方库中一样,但事实并非如此,您已将其分离到另一个文件(您自己的)中,以避免库文件更新时出现问题
  • 仅供参考:在本例中使用Corona SDK
下面的示例:这里有一个错误:“尝试调用全局‘getANumber’(一个nil值)”。在方法上,任何更好的方法都受到欢迎

梅因·卢阿

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

myLibrary:doX()
myLibrary:doY()   -- <=== ERROR HERE
myLibraryExtension.lua

local M = {}

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

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

return M

无法从
myLibraryExtension.lua
文件调用
getANumber
函数。本地函数仅存在于
库.lua
作用域中,并且由于解释的原因不能在外部使用。如果您想访问private(read
local
)函数,可以修改如下脚本:

library.lua
在返回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
),从而使用传递的库引用


然后,此对象可以访问所需的局部函数。

通常,当您使用局部变量时,您希望它们是私有的,并且您编写代码时假设没有其他人可以篡改您的局部变量。此外,从外部访问它们的唯一方法是使用调试库。有什么原因不能让这些函数公开,或者将它们放在传递给扩展的表中(可能使用setfenv或_ENV获得更好的语法)?@hugomg它只是一个第三方库,所以我不想碰它,以避免任何问题,如果它有更新-这有意义吗?因为你想摆弄库的内部,你不能相信库的未来版本将与你的扩展兼容。他们可以摆脱
getANumber
,或者巧妙地改变它的行为方式。此时,您最好直接打开库并编辑原始文件。谢谢,运行良好(并将我需要放入库中的内容减至最少)。关于是否有方法使myLibraryExtension.lua更简单(行数更少)的任何建议比我拥有的还要多?@Greg当然。你基本上是在尝试定义选择性
\uu索引
元方法。看看
myLibrary.doY( myLibrary ) -- yes, myLibrary is passed as an argument too