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参数重载
调用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参数的函数重载
如果想要在toLua中使用out重载,有一个固定套路,就是out参数传入nil占位即可
这意味着我们在使用Unity中的一些api中有out时,我们就可以用nil占位了
1 2
| print(obj:Calc(10, 1)) print(obj:Calc(10, nil))
|
但是对于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))
|