待实践的内容
- BaseClass
- metatable和{}区别
- __index 和 __newIndex
- __pair
- LuaDll -- 和C#交互
- ToLua -- 蒙哥出品
- lua八皇后问题
- lua接入Unity OnStart()
总结
经历了精力耗尽的一天,才搞定了__pair的自定义,在调用 for pairs() do 会轻松一点点,又双叒发现了写程序的坑
- 没有写死循环,崩溃的代码,你都不要说自己写过程序
- 试新代码九死一生
- 总有简单的替换或实现方法,舍近求远需谨慎
- 没其他了,只是个人记录一下,不怎么通用
乱写代码
C# ,基于蒙哥的 toLua
//注册部分
L.RegVar("this", _this, null);
L.RegFunction("__tostring", ToLua.op_ToString);
L.RegFunction("__pairs", LoopList);
L.RegVar("Capacity", get_Capacity, set_Capacity);
L.RegVar("Count", get_Count, null);
L.EndClass();
}
//实现部分
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int Func(IntPtr L)
{
UnityEngine.Debug.Log("key=func??");
return 1;
}
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int Loop(IntPtr L)
{
//暂时无法从这里取key,没法好像 lua 一摸一样地自增,待查
//string key = ToLua.ToString(L, 2);
//UnityEngine.Debug.Log("key=" + key);
//int index = 0;
//if (!string.IsNullOrEmpty(key))
//{
// index = int.Parse(key);
//}
int index = k_index;
System.Collections.Generic.List<Nirvana.UIVariableBind> obj = (System.Collections.Generic.List<Nirvana.UIVariableBind>)ToLua.CheckObject(L, 1, typeof(System.Collections.Generic.List<Nirvana.UIVariableBind>));
if (index >= obj.Count)
{
LuaDLL.lua_pushnil(L);
LuaDLL.lua_pushnil(L);
return 2;
}
var o = obj[index];
//index++;
k_index++;
LuaDLL.lua_pushinteger(L, k_index);
LuaDLL.lua_pushstring(L, "test");
return 2;
}
static int k_index;
[MonoPInvokeCallbackAttribute(typeof(LuaCSFunction))]
static int LoopList(IntPtr L)
{
//LuaDLL.lua_pushinteger(L, 1);
//LuaDLL.lua_pushstring(L, "hha");
k_index = 0;
System.Collections.Generic.List<Nirvana.UIVariableBind> obj = (System.Collections.Generic.List<Nirvana.UIVariableBind>)ToLua.CheckObject(L, 1, typeof(System.Collections.Generic.List<Nirvana.UIVariableBind>));
LuaDLL.lua_pushcfunction(L, Loop);
//LuaDLL.lua_pushinteger(L, 3333);
//LuaDLL.lua_pushnil(L);
ToLua.PushObject(L, obj);
LuaDLL.lua_pushnil(L);
return 3;
}
lua部分
UIVariableLua = UIVariableLua or BaseClass()
function UIVariableLua:__init(uiv)
self._uiv = uiv
self._ut = {}
self._ut[1] = 1
self._ut[2] = "xxx"
local default_t = {f="ff",s="sss",}
local default_cursor = 1
local func = function ( tbl,key )
local nk,nv
local cursor = 1
for k,v in pairs(default_t) do
if default_cursor==cursor then
nk = k
nv = v
end
cursor = cursor + 1
end
default_cursor = default_cursor + 1
return nk,nv
end
local mt = {}
mt.__pairs = function ( tbl,key )
return func,tbl,nil
end
setmetatable(self._ut,mt)
end
lua调用方法
function UIVariableLua:BindInit( ... )
for k,b in pairs(self._ut) do
print_error("self.ut")
print_error("k="..tostring(k))
print_error("b="..tostring(b))
end
end
乱写代码的分段解析
(待补充)
长代码记录
--TODO 之后再看看原理
function InitMemtableTa(cfg)
local default_table = cfg["default_table"]
if nil == default_table then
return
end
local func = function (tbl, key)
local nk, nv = next(default_table, key)
if nk then
nv = tbl[nk]
end
return nk, nv
end
local mt = {}
mt.__index = function(tbl, key)
local val = rawget(tbl, key)
return val or default_table[key]
end
mt.__pairs = function(tbl, key)
print_error("ta __pairs")
return func, tbl, nil
end
print_error("ta cfg")
for k, v in pairs(cfg) do
if k ~= "default_table" then
setmetatable(v, mt)
end
end
print_error("ta done")
end
UIVariableTa = UIVariableTa or BaseClass()
function UIVariableTa:__init( )
end
UIVariableLua = UIVariableLua or BaseClass()
function UIVariableLua:__init(uiv)
self._uiv = uiv
self._ut = {}
self._ut[1] = 1
self._ut[2] = "xxx"
--3.。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
-- local utTable = {} -- 3.要加一个table
-- utTable[1] = 0
-- utTable[2] = 1
-- self._ut["default_table"] = utTable
-- --self._ut["www"] = utTable --不能用同一个引用,会死循环
-- InitMemtableTa(self._ut)
--2..............................
-- --print_error("UIVariableLua new1")
-- --self._ut = UIVariableTa.New() -- 2.对象并没有用
-- --print_error("UIVariableLua new2")
-- local func = function (tbl, key)
-- local nk, nv = next(default_table, key)
-- if nk then
-- nv = tbl[nk]
-- end
-- return nk, nv
-- end
-- self._ut.__pairs = function ( tbl,key )
-- print_error("self.ui in __pairs")
-- print_error(tbl)
-- print_error(key)
-- local funcTable = {}
-- funcTable[1] = "1111"
-- funcTable[2] = "2222"
-- --return funcTable,tbl,key
-- end
local default_t = {f="ff",s="sss",}
local default_cursor = 1
local func = function ( tbl,key )
-- -- 这么写又死循环了。。。。妈耶
-- print_error("ta func")
-- return 1,"??ffffff"
--dump(tbl,"fffff") -- 自己封装的dump方法,如php var_dump(),可以打印整个嵌套结构,但这里 会提示stack overflow,待查
print_error(tbl) -- 还是自己封装的打印(c# 层,debugger)方法,可以打印输出table,好像不能嵌套打印,待查
print_error(tostring(key).."-"..tostring(default_cursor)) -- key == nil??
-- local nk, nv = next(default_table, key)
-- if nk then
-- nv = tbl[nk]
-- end
-- return nk, nv
-- 其实不会一直 key ==nil
-- if key=="s" then
-- return nil,nil
-- else
local nk,nv
local cursor = 1
for k,v in pairs(default_t) do
if default_cursor==cursor then
nk = k
nv = v
end
cursor = cursor + 1
end
default_cursor = default_cursor + 1
--local nk,nv = next(default_t,key)
print_error("nk=" ..tostring(nk))
print_error("nv="..tostring(nv))
return nk,nv
--end
end
--4....................
print_error("ta 4")
local mt = {}
-- mt.__index = function(tbl, key)
-- -- local val = rawget(tbl, key)
-- -- return val or default_table[key]
-- return tbl[key] -- 会触发pairs
-- end
mt.__pairs = function ( tbl,key )
print_error("__pairs tbl="..tostring(tbl))
print_error("__pairs k=".. tostring(key))
return func,tbl,nil
end
setmetatable(self._ut,mt)
print_error("ta 4 done")
end