UH2S3L15——Lua调用函数(重载)

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
24
25
26
27
28
29
30
31
32
33
34
35
36
public class Lesson6
{
public int Calc()
{
return 100;
}

public int Calc(int a, int b)
{
return a + b;
}

public int Calc(int a, out int b)
{
b = 10;
return a + b;
}

public int Calc(int a)
{
Debug.Log("Int");
return a;
}

public float Calc(float a)
{
Debug.Log("Float");
return a;
}

public string Calc(string str)
{
Debug.Log("String");
return str;
}
}

数值参数重载精度问题

对于下面的重载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public int Calc()
{
return 100;
}
public int Calc(int a)
{
Debug.Log("Int");
return a;
}
public float Calc(float a)
{
Debug.Log("Float");
return a;
}
public string Calc(string str)
{
Debug.Log("String");
return str;
}

toLua和xLua一样,对重载函数的精度支持不太好,lua中只有Number​一种数值类型,会导致其分不清该使用何种数值重载,
因此不建议使用不同精度的数值类型重载函数

1
2
3
4
5
local obj = Lesson6()
print(obj:Calc())
print(obj:Calc(1))
print(obj:Calc(1.2))
print(obj:Calc("123"))

可以看见,obj:Calc(1))​默认调用了float​参数重载

image

调用out或ref参数重载问题

对于下面的重载

1
2
3
4
5
6
7
8
9
public int Calc(int a, int b)
{
return a + b;
}
public int Calc(int a, out int b)
{
b = 10;
return a + b;
}

toLua会默认调用非out​参数的函数重载

1
print(obj:Calc(10, 1))

image

如果想要在toLua中使用out​重载,有一个固定套路,就是out​参数传入nil​占位即可
这意味着我们在使用Unity中的一些api中有out​时,我们就可以用nil​占位了

1
2
print(obj:Calc(10, 1))
print(obj:Calc(10, nil))

image

但是对于ref​重载:

1
2
3
4
5
6
7
8
9
public int Calc(int a, int b)
{
return a + b;
}
public int Calc(int a, ref int b)
{
b = 10;
return a + b;
}

我们就不能传入nil​,因为ref参数传入的值必须初始化,但如果不传入nil​,就会默认使用不带ref​参数的重载
因此,在toLua中,我们无法使用带ref​参数的方法

1
2
print(obj:Calc(10, 1))
print(obj:Calc(10, nil)) -- 报错