一般情况下,我们调用函数时,传的参数都是普通数据类型或者复合数据类型,如果你把一个函数也当作一个函数传来传去,那么这就有点那啥意思了,啥意思,函数式的意思。
在函数编程范式里面,函数成了一等公民,与普通数据类型平起平坐。
一、定义一个函数,他的返回类型不是普通值,而是一个函数
/// <summary>
/// 返回一个函数
/// </summary>
/// <returns>返回的函数为Func<string,string>类型:输入一个string,然后返回一个string </returns>
Func<string,string> GetFunction()
{
Func<string,string> rtnFn = (name) =>
{
return name+" return";
};
return rtnFn;
}
上面定义了一个函数GetFunction(),它的返回值是一个函数,这个函数的签名为输入string 返回 string,也就是Func<string,string>。
二、测试这个函数
/// <summary>
/// just for debug
/// </summary>
public string arg;
#if UNITY_EDITOR
[ContextMenu("测试")]
#endif
void test()
{
var rtn = GetFunction()(arg);
Debug.Log(rtn);
//等效的写法
var myFn = GetFunction();
Debug.Log(myFn(arg));
}
如图,用编辑器菜单直接测试:
三、测试结果
四、案例代码及说明
- 1、测试环境:Unity2020.3 , C#8.0 ,Visual Studio 2022
- 2、直接把下面的脚本挂在到scene中的一个物体上,然后进行测试
脚本【NewBehaviourScript .cs】代码清单
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class NewBehaviourScript : MonoBehaviour
{
/// <summary>
/// 返回一个函数
/// </summary>
/// <returns>返回的函数为Func<string,string>类型:输入一个string,然后返回一个string </returns>
Func<string,string> GetFunction()
{
Func<string,string> rtnFn = (name) =>
{
return name+" return";
};
return rtnFn;
}
/// <summary>
/// just for debug
/// </summary>
public string arg;
#if UNITY_EDITOR
[ContextMenu("测试")]
#endif
void test()
{
var rtn = GetFunction()(arg);
Debug.Log(rtn);
//等效的写法
var myFn = GetFunction();
Debug.Log(myFn(arg));
}
}