UH2S2L15——Lua调用带out和ref的函数

调用带out和ref的函数

多个out,ref参数用多返回值接收

  • out参数

    注意:out在Lua中不算参数如果有返回值 第一个返回值就是返回值 之后依次返回out

  • ref参数

    注意:ref和out不同,在Lua中算参数,我们必须传入一个值

先在C#脚本内声明如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Lesson5
{
public int RefFun(int a, ref int b, ref int c, int d)
{
b = a + d;
c = a - d;
return 100;
}

public int OutFun(int a, out int b, out int c, int d)
{
b = a;
c = d;
return 200;
}

public int RefOutFun(int a, out int b, ref int c)
{
b = a * 10;
c = a * 20;
return 300;
}
}

调用带ref参数的函数

ref​参数,会以多返回值的形式返回给lua,如果函数存在返回值,那么第一个值就是该返回值,之后的返回值,就是ref​的结果,从左到右一一对应
ref​参数,需要传入一个默认值,占位置,即该参数不可以略过或者忽略,必须传入一个值占位

  • 假设参数为(int a, ref int b, ref int c, int d)​,则中间两个值必须传入值占位,哪怕值不会起作用,否则第四个参数无法传入
1
2
3
4
5
6
7
Lesson5 = CS.Lesson5
local obj = Lesson5()

local a, b, c = obj:RefFun(1, 0, 0, 1) --如果C#函数存在返回值,则Lua脚本的函数里第一个返回值就算这个返回值,之后和ref参数一一对应
print(a) --函数返回值
print(b) --第一个 ref
print(c) --第二个 ref

image

如果少传入参数,或者忽略ref​参数的传入,则剩余的参数默认会传入0补位,即使ref​相关参数没有作用,
因此我们必须要用值在对应的****​ref参数位置占位

1
2
3
4
local a, b, c = obj:RefFun(1, 1)        --等同于obj:RefFun(1, 1, 0, 0)
print(a)
print(b)
print(c)

image

调用带out参数的函数

out​参数,会以多返回值的形式返回给lua,如果函数存在返回值,那么第一个值就是该返回值,之后的返回值,就是out​的结果,从左到右一一对应
out​参数,不需要传占位置的值,需要跳过out​参数,如果传入参数数量多于非out​参数数量,则只取前面的参数,后面的参数忽略

  • 假设参数为(int a, out int b, out int c, int d)​,则中间两个参数不需要传入,如果传入,只会取传入的前面的值,可能造成传入错位!
1
2
3
4
local a, b, c = obj:OutFun(20, 30)        --需要跳过了out参数的传入!否则可能传入参数出现问题
print(a) --函数返回值
print(b) --第一个 out
print(c) --第二个 out

image

1
2
3
4
5
--C#: public int OutFun(int a, out int b, out int c, int d)
local a, b, c = obj:OutFun(20, 100, 200, 30) --如果你不跳过out参数传入,则30无法准确的传入到d中!多出的参数会被忽略!
print(a)
print(b)
print(c)

image

调用混合out和ref参数的函数

混合使用时,综合上面的规则,ref​需占位,out​不用传
第一个是函数的返回值,之后,从左到右依次对应ref​或者out

1
2
3
4
local a, b, c = obj:RefOutFun(20, 1)
print(a) --返回值
print(b) --out
print(c) --ref

image