15.Lua调用C#的ref和out函数

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

×

喜欢就点赞,疼爱就打赏