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

基于 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)

为什么?

点赞
用户90511
用户90511

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

-- 在 session.lua 中
return Session

-- 在另一个文件中
local Session = require 'session'

最后,你的第一个解决方案之所以能够工作,是因为你将 Session 定义为了全局变量,其他模块也能看到它。我建议你尽可能避免使用全局变量,所以你可以将 Session 变成 session.lua 中的局部变量。

local Session = class(function() ... end)

把所有的东西放在一起,下面是你的 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
2014-05-10 16:27:21
用户106140
用户106140

下面是可用的版本:

--[[
--------------------------------------------------------------------
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
2014-05-10 17:32:59