• ulua c#调用lua中模拟的类成员函数


    项目使用ulua,我神烦这个东西。lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了。要记住贼多的细节,你才能稍微处理好。一个破栈,pop来push去,位置一会在-1,一会在-3,21世纪已经过去五分之一了好吗,谁乐意像汇编一样操作?那十几个操作函数,愣是比正则表达式规则还难记,用完就忘。我发现lua心智负担完全跟简洁搭不上边,贼他娘重,实现个面向对象都乱七八糟。我学c++都没觉得有什么不爽的,就lua代码各种不乐意看,各种小tips在那里,什么meta,weak,_G,逼着你记得各种trick,或者好听点,叫做元搭建。Fuck,怎么不去死。用lua这类小众语言就像用linux的工具,某种意义上,它们其实也容易形成一种壁垒,我管这叫他奶奶的细节地狱。老子想来场说走就走的旅行,你给我一袋工具,先组装一个自行车先,你是从清朝穿越来搞笑的吗?

    哥哥只是想c#调个lua模拟的类,折腾的不得不去看细节,顺带又回忆了programing in lua 24-26章。lua遇到unity,就像王八遇到乌龟,真是极品配极品。unity单看是极好的,咋就遇到热更新这种屁事呢。

    哇塞,戾气好重,还是先上代码吧。

    以下2个函数添加到LuaScriptMgr,LuaFunction,就可以调用lua中实现的类似fuckmodule:overridefuck()的函数了。

        public object[] CallLuaModuleFunction(string name, params object[] args)
        {
            LuaBase lb = null;
    
            if (dict.TryGetValue(name, out lb))
            {
                LuaFunction func = lb as LuaFunction;
                return func.Call(args);
            }
            else
            {
                IntPtr L = lua.L;
                LuaFunction func = null;
                int oldTop = LuaDLL.lua_gettop(L);
    
                bool error = false;
    
                
                int pos = name.LastIndexOf('.');
    
                if (pos > 0)
                {
                    string tableName = name.Substring(0, pos);
    
                    if (PushLuaTable(L, tableName))
                    {
                        string funcName = name.Substring(pos + 1);
                        LuaDLL.lua_pushstring(L, funcName);
                        LuaDLL.lua_gettable(L, -2);
                    }
    
                    LuaTypes type = LuaDLL.lua_type(L, -1);
    
                    if (type != LuaTypes.LUA_TFUNCTION)
                    {
                        LuaDLL.lua_settop(L, oldTop);
                        error = true;
                    }
                }
                else
                {
                    LuaDLL.lua_getglobal(L, name);
                    LuaTypes type = LuaDLL.lua_type(L, -1);
    
                    if (type != LuaTypes.LUA_TFUNCTION)
                    {
                        LuaDLL.lua_settop(L, oldTop);
                        error = true;
                    }
                }
    
                if (!error)
                {
                    int reference = LuaDLL.luaL_ref(L, LuaIndexes.LUA_REGISTRYINDEX);
                    func = new LuaFunction(reference, lua);
                    //LuaDLL.lua_settop(L, oldTop);
                    object[] objs = func.CallMember(args);
                    func.Dispose();
                    return objs;
                }
    
                return null;
            }
        }
            internal object[] callmember(object[] args, Type[] returnTypes)
            {
                int nArgs = 0;
                LuaScriptMgr.PushTraceBack(L);
                int oldTop = LuaDLL.lua_gettop(L);
    
                if (!LuaDLL.lua_checkstack(L, args.Length + 6))
                {
                    LuaDLL.lua_pop(L, 1);
                    throw new LuaException("Lua stack overflow");
                }
    
                push(L);
                
                LuaDLL.lua_pushvalue(L, -3);  //推入this即函数所在的表本身,-1是函数,-2是错误处理函数,-3是函数所在的表
                
                if (args != null)
                {
                    nArgs = args.Length;
    
                    for (int i = 0; i < args.Length; i++)
                    {
                        PushArgs(L, args[i]);
                    }
                }
    
                int error = LuaDLL.lua_pcall(L, nArgs + 1, -1, -nArgs - 3);
    
                if (error != 0)
                {
                    string err = LuaDLL.lua_tostring(L, -1);
                    LuaDLL.lua_settop(L, oldTop - 1);
                    if (err == null) err = "Unknown Lua Error";
                    throw new LuaScriptException(err, "");
                }
    
                object[] ret = returnTypes != null ? translator.popValues(L, oldTop, returnTypes) : translator.popValues(L, oldTop);
                LuaDLL.lua_settop(L, oldTop - 2);
                return ret;
            }
  • 相关阅读:
    基本语法-函数
    基本语法-变量
    python+selenium2自动化------quit()和close()区别
    docker搭建bwapp漏洞测试环境
    软件测试---登录功能的测试用例
    Faker开源库构造测试数据
    selenium自动化简易测试框架总结
    ddt+unittest+HTMLTestRunner,生成测试报告时,报告中没有输出测试用例函数的描述信息
    python+selenium2自动化---PageObject模式+unittest结合实现自动化
    python+selenium2自动化---关键字驱动+unittest结合实现自动化
  • 原文地址:https://www.cnblogs.com/flytrace/p/7062955.html
Copyright © 2020-2023  润新知