基于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)
。
为什么?
答案 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