lua调C#时点(.)操作符和冒号(:)操作符的区别

发表于2018-08-07
评论0 5.3k浏览
在lua开发中我们经常会在调C#时混淆点(.)操作符和冒号(:)操作符之间的区别,下面就给大家解释下:

1、首先贴上C#代码  
public static int AddChild( IntPtr l )
    {
        Debug.Log( "栈大小 " + LuaDLL.lua_gettop( l ) );
        Debug.Log( "type = " + LuaDLL.lua_type( l, 1 ) );
        GameObject parent = ToLua.ToVarObject( l, 2 ) as GameObject;
        if( parent != null )
        {
            Debug.Log( "创建对象 " + parent.name );
        }
        else
        {
            Debug.Log( "创建对象失败" );
        }
        string path1 = lua_.LuaToString( 3 );
        string path2 = LuaDLL.lua_tostring( l, 3 );
        string path3 = ToLua.ToString( l, 3 );
        Debug.Log( "path 1 = " + path1 );
        Debug.Log( "path 2 = " + path2 );
        Debug.Log( "path 3 = " + path3 );
        lua_.GetFunction( "Main" );
        LuaDLL.lua_pcall( l, 0, 0, 0 );
        return 1;
    }
上面这段代码用来判断lua穿过来的参数

2、Lua代码
function TestStatic()
	--由生成的wrap文件调用
	MyHelloWorld.Init()
	--由生成的闭包去调用,本文用到的方式
	local go = UnityEngine.GameObject.New("LuaObj")
	LuaNTools.AddChild( go, "test")
end
LuaNTools的调用可用用点操作符(.)也可以用冒号操作符(:)
  
3、不同之处

1.使用点操作符,没用语法糖,即传给C#的参数数量即是lua里穿的数量。  
2.使用冒号操作符,有语法糖,传给C#的参数数量比lua传的参数数量+1,因为第一个参数是Lua的表,即此处的LuaNTools  

4、示意图

1.使用冒号
local go = UnityEngine.GameObject.New("LuaObj")
LuaNTools:AddChild( go, "test")

2.使用点  
local go = UnityEngine.GameObject.New("LuaObj")
LuaNTools.AddChild( go, "test")

注意在获取Lua传递过来的参数时,栈的位置,点和冒号,在获取栈的位置差1

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: