lua调C#时点(.)操作符和冒号(:)操作符的区别
发表于2018-08-07
在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