lua setmetatable - 错误 = 尝试调用全局函数'setmetatable'(值为nil)

我正在为Lua(5.1)创建一个VLC播放器的插件。它应该尽可能小,因此我希望将所有需要的函数集成到一个Lua文件中(我不想让用户烦恼于额外的模块文件)。因此,我希望直接将来自外部模块的一些函数嵌入到我的Lua文件中。

我需要从 numberlua 模块中获取几个位函数:bxor()band()rshift()lshift()

numberlua 模块中的原始代码如下(已经缩短了,这是我需要的全部内容),当我将其作为模块使用时,它可以正常工作,但当我从模块中提取这些(包括几个相关的)函数并插入到我的Lua文件中(好吧,将M删除)之后,我收到了错误:

尝试调用全局函数“ setmetatable”(值为nil

虽然在模块内部 setmetatable 工作,但如果提取它则不起作用!

在模块内部工作的代码如下:

local M = {_TYPE = 'module',_NAME ='bit.numberlua',_VERSION ='0.3.1.20120131'}

local MOD = 2 ^ 32
local MODM = MOD-1

local function memoize(f)
local mt = {} 
local t = setmetatable({},mt)
function mt:__index(k)
local v = f(k); t [k] = v
return v 
 end 
 return t
 end 

local function make_bitop_uncached(t,m)
local function bitop(a,b)
local res,p = 0,1
while a~ = 0 and b~ = 0 do
local am,bm = a%m,b%m
res = res + t [am] [bm] * p
a =(a - am)/ m 
b =(b - bm)/ m
p = p * m
 end
res = res +(a + b)* p
return res 
 end
返回bitop
 end

local function make_bitop(t)
local op1 = make_bitop_uncached(t,2 ^ 1)
local op2 =记忆(function(a)
return memoize(function(b)
return op1(a,b)
end)
end)
return make_bitop_uncached(op2,2 ^(t.n or 1))
end

M.bxor = make_bitop {[0]={[0]=0,[1]=1},[1]={[0]=1,[1]=0},n = 4}
local bxor = M.bxor

function M.band(a,b)return((a + b)- bxor(a,b))/ 2 end
本地band = M.band

function M.bor(a,b)return MODM - band(MODM-a,MODM-b)end
local bor = M.bor

local lshift,rshift--前向声明

function M.rshift(a,disp) - Lua5.2受到启发
if disp <0 then return lshift(a,-disp)end
return math.floor(a%2 ^ 32 / 2 ^ disp)
 end
rshift = M.rshift

function M.lshift(a,disp) - 向左移动受到Lua5.2的启发
if disp <0 then return rshift(a,-disp)end
return(a * 2 ^ disp)% 2 ^ 32
 end
lshift = M.lshift

返回M

所以我将其从模块中使用:

local bit = require("numberlua")

我有像 bit.rshift() 这样的 rshift 函数

如何直接将模块中的函数嵌入Lua文件并像本地函数一样使用这些函数?

点赞