在模块中存储单个函数
Storing a single function in a module
我正在为对象创建原型,我希望构造函数采用允许对象从外部模块获取函数的参数。这是我的代码。我会在下面进一步解释我的问题。
对象原型:
local obj = {}
local obj_mt = { __index = obj }
function obj.new( moduleString )
local newObj = {}
newObj:f = require( moduleString )
return setmetatable( newObj, obj_mt )
end
return obj
功能模块:
local function foo()
-- code
end
return foo
当我运行这个时,我得到一个错误告诉我在newObj:function =之后,应该有函数参数。我不是通过 require(moduleString) 返回一个函数吗?我需要提及的另一件事是,如果我使用:
newObj.f = require( moduleString )
而不是:
newObj:f = require( moduleString )
将函数存储在 table newObj 中没有问题,但是当我 运行 它时,函数不能使用 self 参数来引用 newObj(或在原型构建)。所以基本上我需要的是一个存储在外部模块中的函数,它可以访问父 table 它是在使用 self 关键字加载时放置的。
编辑: 这是代表 foo() 的实际函数:
local function AIfollow( path, L, R, T, B, X, Y )
local L = L
local R = R
local T = T
local B = B
local x = self.img.x <---- Here is the error
local y = self.img.y
local xLoc = ( X - X%tileSize )/tileSize
local yLoc = ( Y - Y%tileSize )/tileSize
if( xLoc < R and xLoc > L and yLoc < T and yLoc > B ) then
local vx = self.img.x - x
local vy = self.img.y - y
local d = math.sqrt( vx*vx + vy*vy )
self.img:setLinearVelocity( vx/d*self.speed, vy/d*self.speed )
else
self.img:setLinearVelocity( path[x][y].vX*self.speed, path[x][y].vY*self.speed )
end
end
这东西的细节不重要;我想指出的是,在标记的行中,我收到一条错误消息,告诉我它正在尝试索引一个不存在的全局变量 self。我不知道该怎么做是使函数 AIfollow 中的自我引用它分配给的 table。
我想这就是你想要做的:
main.lua
m = require 'module'
m:new('foo')
m:f()
foo.lua
local function foo(self)
print('Inside foo')
end
return foo
module.lua
local m = {}
local m_mt = { __index = m }
function m:new( moduleString )
self.newObj = {}
self.f = require( moduleString )
return setmetatable( self.newObj, m_mt )
end
return m
这是一种不同的方法,可能更接近您的要求。
main.lua
m = require 'module'
a = m:new('foo','A',{'a','b','c'})
a:f()
b = m:new('foo','B',{'aa','bb','cc'})
b:f()
a:f() --once again call A to verify two different objects exist
foo.lua
local function foo(self)
print('Inside foo '..self.title)
for k,v in pairs(self.dat) do
print(k,v)
end
end
return foo
module.lua
local m = {}
function m:new(moduleString, title, table)
self = {}
self.title = title or '' --none by default
self.dat = table or {} --optional table data
self.f = require( moduleString )
return self --return object reference
end
return m
我正在为对象创建原型,我希望构造函数采用允许对象从外部模块获取函数的参数。这是我的代码。我会在下面进一步解释我的问题。
对象原型:
local obj = {}
local obj_mt = { __index = obj }
function obj.new( moduleString )
local newObj = {}
newObj:f = require( moduleString )
return setmetatable( newObj, obj_mt )
end
return obj
功能模块:
local function foo()
-- code
end
return foo
当我运行这个时,我得到一个错误告诉我在newObj:function =之后,应该有函数参数。我不是通过 require(moduleString) 返回一个函数吗?我需要提及的另一件事是,如果我使用:
newObj.f = require( moduleString )
而不是:
newObj:f = require( moduleString )
将函数存储在 table newObj 中没有问题,但是当我 运行 它时,函数不能使用 self 参数来引用 newObj(或在原型构建)。所以基本上我需要的是一个存储在外部模块中的函数,它可以访问父 table 它是在使用 self 关键字加载时放置的。
编辑: 这是代表 foo() 的实际函数:
local function AIfollow( path, L, R, T, B, X, Y )
local L = L
local R = R
local T = T
local B = B
local x = self.img.x <---- Here is the error
local y = self.img.y
local xLoc = ( X - X%tileSize )/tileSize
local yLoc = ( Y - Y%tileSize )/tileSize
if( xLoc < R and xLoc > L and yLoc < T and yLoc > B ) then
local vx = self.img.x - x
local vy = self.img.y - y
local d = math.sqrt( vx*vx + vy*vy )
self.img:setLinearVelocity( vx/d*self.speed, vy/d*self.speed )
else
self.img:setLinearVelocity( path[x][y].vX*self.speed, path[x][y].vY*self.speed )
end
end
这东西的细节不重要;我想指出的是,在标记的行中,我收到一条错误消息,告诉我它正在尝试索引一个不存在的全局变量 self。我不知道该怎么做是使函数 AIfollow 中的自我引用它分配给的 table。
我想这就是你想要做的:
main.lua
m = require 'module'
m:new('foo')
m:f()
foo.lua
local function foo(self)
print('Inside foo')
end
return foo
module.lua
local m = {}
local m_mt = { __index = m }
function m:new( moduleString )
self.newObj = {}
self.f = require( moduleString )
return setmetatable( self.newObj, m_mt )
end
return m
这是一种不同的方法,可能更接近您的要求。
main.lua
m = require 'module'
a = m:new('foo','A',{'a','b','c'})
a:f()
b = m:new('foo','B',{'aa','bb','cc'})
b:f()
a:f() --once again call A to verify two different objects exist
foo.lua
local function foo(self)
print('Inside foo '..self.title)
for k,v in pairs(self.dat) do
print(k,v)
end
end
return foo
module.lua
local m = {}
function m:new(moduleString, title, table)
self = {}
self.title = title or '' --none by default
self.dat = table or {} --optional table data
self.f = require( moduleString )
return self --return object reference
end
return m