lua:为什么我不能使用包裹的名称?

时间:2014-05-10 15:30:30

标签: lua

基于SimpleLuaClasses我在文件中完成了一个课程:

require 'class'

Session = class(function(self)
    self.session_name = "l_sid"
end)

function Session:init(r)
    self.session_id = r:getcookie(self.session_name)
    if not self.session_id then
        self.session_id = r:sha1(tostring(r.log_id) .. r.clock())
        r:setcookie({
            key =   self.session_name,
            value = self.session_id
        })
    end
end;

现在我正在尝试这个:

local session = require 'session'

function handle(r)
    local s = Session()
    s:init(r)
end

以前的代码有效。如果我尝试local s = session.Session(),则无效。

当我尝试这个时,我收到此错误:attempt to index upvalue 'session' (a boolean value)

为什么?

2 个答案:

答案 0 :(得分:2)

require函数的返回值是从模块返回的值。例如,如果您创建了一个文件" foo.lua"具有以下内容

-- This is foo.lua
return 17

当您在其他文件中执行时

local x = require 'foo'
print(x)

它打印17。

在您的情况下,为了让session.Session工作,您需要返回一个包含来自" session.lua"

Session字段的表格
return { Session = Session }

或者,如果您没有返回任何其他内容,也可以直接返回Session

-- in session.lua
return Session

-- in the other file
local Session = require 'session'

最后,你的第一个解决方案正在起作用的原因是你将Session定义为一个全局变量,从每个模块都可以看出。我建议尽可能避免全局变量,这样你就可以在Session.lua

中将Session转换为本地
local Session = class(function() ... end)

将所有内容编译在一起,这是你的fiull session.lua文件应该是什么样子

require 'class'

local Session = class(function(self)
    self.session_name = "l_sid"
end)

function Session:init(r)
    self.session_id = r:getcookie(self.session_name)
    if not self.session_id then
        self.session_id = r:sha1(tostring(r.log_id) .. r.clock())
        r:setcookie({
            key =   self.session_name,
            value = self.session_id
        })
    end
end;

return Session

答案 1 :(得分:1)

这是一个有效的版本:

--[[
--------------------------------------------------------------------
Classe Session
]]--
require 'class'

local session = {}

session.Session = class(function(self)
    self.session_name = "l_sid"
end)

function session.Session:init(r)
    self.session_id = r:getcookie(self.session_name)
    if not self.session_id then
        self.session_id = r:sha1(tostring(r.log_id) .. r.clock())
        r:setcookie({
            key =   self.session_name,
            value = self.session_id
        })
    end
end;

return session