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