记一次Lua原表初始化 __index 和 __pair得自定义

待实践的内容

  • 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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

avi9111

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值