15.Lua调用CSharp-ref和out函数
15.1 知识点
准备工作
启动Lua脚本
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson15_Lua调用CSharp_ref和out函数");
定义有ref和out函数的类并绑定
public class Lesson15_Test
{
public int RefFunction(int a, ref int b, ref int c, int d)
{
int temp = b;
b = c;
c = temp;
return a + d;
}
public int OutFunction(int a, out int b, out int c, int d)
{
b = a;
c = d;
return a + d;
}
public int RefAndOutFunction(int a, out int b, ref int c)
{
b = a * 100;
c = a * 666;
return a;
}
}
在Lua脚本实例化
--需要添加类到CustomSetting
Lesson15_Test = Lesson15_Test
local test = Lesson15_Test()
ref函数
- 有ref修饰的参数的函数在Lua脚本调用时,会以多返回值的形式返回给Lua变量
- 如果ref函数存在返回值,那么在Lua脚本调用时返回的第一个值是ref函数的返回值
- 其他多出来的返回值就是传入的ref的返回值,从左到右一一对应
- ref修饰的参数需要传入一个默认值占位置
local a, b, c = test:RefFunction(1, 666, 999, 1)--正常传参
print(a) -- 2 函数返回值,因为1+1
print(b) -- 999 第一个ref参数b的返回值,函数内b和c交换值
print(c) -- 666 第二个ref参数c的返回值,函数内b和c交换值
out函数
- 有out修饰的参数的函数在Lua脚本调用时,会以多返回值的形式返回给Lua变量
- 如果out函数存在返回值,那么在Lua脚本调用时返回的第一个值是out函数的返回值
- 其他多出来的返回值就是传入的out的返回值,从左到右一一对应
- out修饰的参数也需要传占位置的值,这一点和xLua不同,通常传0进行占位,传nil也不会报错
- toLua的官方文档只要out的示例,使用toLua的时候尽量使用out
local a, b, c = test:OutFunction(100, 0, nil, 200)--100对应参数a 2--对应参数d
print(a) -- 300 函数返回值,因为100+200
print(b) -- 100 第一个out参数b的返回值,函数内b被赋值第一个参数
print(c) -- 200 第二个out参数c的返回值,函数内b被赋值第四个参数,由于out参数忽略实际上赋值的是200
ref和out函数
- ref和out同时修饰函数参数时,ref和out都需传入占位值
- 第一个返回值是函数的返回值,之后的返回值从左到右依次对应ref或者out
local a, b, c = test:RefAndOutFunction(10, 1, 0)--10对应默认参数 1对应ref参数 0对应out参数
print(a) -- 10 函数内直接返回参数a
print(b) -- 1000 out参数拿a的值乘了100
print(c) -- 6600 ref参数拿a的值乘了666
15.2 知识点代码
Lesson15_Lua调用CSharp_ref和out函数.lua
print('我是Lua脚本 Lesson15_Lua调用CSharp_ref和out函数')
--需要添加类到CustomSetting
Lesson15_Test = Lesson15_Test
local test = Lesson15_Test()
print("**********知识点一 ref函数************")
--有ref修饰的参数的函数 在Lua脚本调用时 会以多返回值的形式返回给lua变量
--如果ref函数存在返回值 那么在Lua脚本调用时返回的第一个值是ref函数的返回值
--其他多出来的返回值 就是传入的ref的返回值 从左到右一一对应
--ref修饰的参数 需要传入一个默认值 占位置
local a,b,c = test:RefFunction(1, 666, 999, 1)--正常传参
print(a)--2 函数返回值 因为1+1
print(b)--999 第一个ref参数b的返回值 函数内b和c交换值
print(c)--666 第二个ref参数c的返回值 函数内b和c交换值
print("**********知识点二 out函数************")
--有out修饰的参数的函数 在Lua脚本调用时 会以多返回值的形式返回给lua变量
--如果out函数存在返回值 那么在Lua脚本调用时返回的第一个值是out函数的返回值
--其他多出来的返回值 就是传入的out的返回值 从左到右一一对应
--out修饰的参数 也需要传占位置的值 这一点和xLua不同 通常传0进行占位 传nil也不会报错
--toLua的官方文档只要out的示例 使用toLua的时候尽量使用out
local a,b,c = test:OutFunction(100,0,nil,200)--100对应参数a 2--对应参数d
print(a)--300 函数返回值 因为100+200
print(b)--100 第一个out参数b的返回值 函数内b被赋值第一个参数
print(c)--200 第二个out参数c的返回值 函数内b被赋值第四个参数 由于out参数忽略实际上赋值的是200
print("**********知识点三 ref和out函数************")
--ref和out同时修饰函数参数时 ref out 都需传入占位值
--第一个返回值是函数的返回值 之后的返回值从左到右依次对应ref或者out
local a,b,c = test:RefAndOutFunction(10,1,0)--10对应默认参数 1对应ref参数 0对应out参数
print(a)--10 函数内直接返回参数a
print(b)--1000 out参数拿a的值乘了100
print(c)--6600 ref参数拿a的值乘了666
Lesson15_Lua调用CSharp_ref和out函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson15_Lua调用CSharp_ref和out函数 : MonoBehaviour
{
void Start()
{
LuaManager.Instance.Init();
LuaManager.Instance.Require("Lesson15_Lua调用CSharp_ref和out函数");
}
}
public class Lesson15_Test
{
public int RefFunction(int a, ref int b, ref int c, int d)
{
int temp = b;
b = c;
c = temp;
return a + d;
}
public int OutFunction(int a, out int b, out int c, int d)
{
b = a;
c = d;
return a + d;
}
public int RefAndOutFunction(int a, out int b, ref int c)
{
b = a * 100;
c = a * 666;
return a;
}
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com