企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 函数(方法) 或许是我对函数和方法的认识不够深入,我通常管它叫函数,但很多人也称之为方法。 我发现,说的其实都是这个东西。 在本节,我会统一称之为函数。 先抛出一个例子 ~~~ void Main() { Echo("Hellow World!"); //显示字符串 Hellow World! } //你可以把这个代码复制到编程块中,点击运行。编程块的右下角会显示Hellow World!。 //这些中文同样可以复制进去,因为//符号后面的这一行的内容都会被认为是注释,不被编译到代码中。 /* 这也是一种注释方法,由上面的两个符号开始,下面两个符号结束,这两个符号之间的内容统统被认为是注释, 并且 可以 自由换行 */ ~~~ 很多人接触过C语言都知道,有一个入口函数叫void main(){}。 太空工程师的编程块中,也有一个入口函数,叫void Main(){},它是由K社规定好的,脚本里必须有这个函数。 脚本运行时,系统会先将Main函数外的东西读一遍,但不会执行。 在Main函数的外面我们通常可以定义公共变量,或写其他的函数。在Main函数外定义的变量,系统会事先分配好内存空间来储存,当一切准备工作就绪,系统才会开始从Main()函数的第一行开始执行每一行代码。 ### 一、函数的声明 除了Main函数是规定死的,其他函数都可以由我们自己定义。 ~~~ void ChangeName() { } ~~~ >[danger] 一个标准的函数,必须由void、ChangeName、()、{}四个部分组成。缺一不可 void表示这个函数是空函数,它不需要返回任何值。当然也可以是其他基本类型 ChangeName这个函数的名字 ()里可以写需要传入的值 {}里写函数执行的具体代码 你可以看到,函数的末尾都不需要分号 ; 而之前声明变量的时候,每一行都需要分号 ; 。这是因为函数的格式太明显了,系统可以不需要分号也能清楚的区分函数。 ### 二、函数的类型 函数也有类型,上面的例子中展示的是最常用的空类型函数,它通常用来将一段被反复使用的代码打包。例如 ~~~ void Main(){ for(int i = 0; i < 10; i ++){ ShowMyName(); //执行10次ShowMyName()函数 } //结果会在编程块右下角显示10行MEA字样 } //声明函数 void ShowMyName(){ Echo("MEA"); } ~~~ >[success] 是不是好奇,为什么在Main函数中先调用了ShowMyName,在下面才声明ShowMyName函数,这样不会出错吗? >上面其实说过了,程序的入口在Main函数的第一行,但Main函数外面的所有东西,都会在程序执行前先被系统检查一遍,我们声明的函数或声明的变量都会被预先分配到各自的内存空间里,Main函数调用它的时候,它已经被准备好了。 函数也有类型,和变量一样。它通常是基本类型或void空类型。 ~~~ int x, int y; void Main(){ //为x和y赋值 x = 5; y = 6; //计算x*y的结果,并赋值给Main函数的局部变量xy int xy = Area(); Echo(xy.ToString()); //输出的时候由于xy是int类型,通过.ToString()转换为string类型才能输出 } int Area(){ int xy = x * y; //这里的xy是Area函数的局部变量,与Main函数的xy没有半毛钱关系 return xy; //当函数不是void类型时,必须严格按照函数的类型,通过return方法返回一个同类型的值 } ~~~ 类似上面这种有类型的函数,我们可以用来计算诸如面积之类的。它的好处在于可以重复使用,计算很多次,而同样的代码我们只需要写一次即可。但这还不是函数最大的优势,下面我们来看看函数的另一个神奇之处:**传参** ### 三、传参 函数可以接收参数,这也正是它那()的用处。 ~~~ void Main(){ int box1 = GetArea(5, 10); int box2 = GetArea(2, 5); Echo(box1.ToString()); //显示50 Echo(box2.ToString()); //显示10 //上面我们使用了一个局部变量来接收函数返回的值,其实也可以不必接收,而是直接使用 GetArea(2, 3); //这样写,我们不接收它返回的值,函数同样会执行一遍,但返回的结果6转瞬即逝的被释放了。 Echo(GetArea(8, 9).ToString()); //我们甚至可以直接把调用函数的代码看做一个int值,直接使用它。这里会显示72 int test = 5*GetArea(2,4); //此时变量test的值会等于40 } int GetArea(int x, int y){ return x*y; } ~~~ 在上面小节中,我们是通过一个公共变量int x, int y来储存要计算的长和宽,然后在函数Area中使用。其实如果真的要大量重复使用,就必须创建大量的公共变量,这样并不科学。 >[danger] 1. 函数可以在()中定义需要接收的参数,参数就是一个变量,必须声明类型和名称。 >2. 在调用函数的时候,如果函数定义了接收1个int型参数,就必须在括号内传入1个int型参数。 >3. 函数可以定义接收多个参数,通过 , 符号分隔。 >4. 函数定义的参数,作用域仅在该函数内,是该函数的局部变量。你不用担心这个参数名和公共变量重名。 ### 四、拓展一些传参的高级写法 实际上,主函数也有参数。 ~~~ void Main(string arguments){ Echo(arguments); } /* 游戏里默认的主函数可以接收一个string类型参数。你可以看到编程块的运行按钮下有一个文本框,你可以在那里输入一些内容。 当你输入了内容,点击运行的时候,这个内容会被以string类型传给主函数。如果你在主函数写明了接收,就可以在函数内接收并使用它。 */ ~~~ 非必须参数 ~~~ void Main(){ int a = getValue(); // a=10 int b = getValue(50); // b=50 } //在接收的时候定义一个默认值,可以在调用的时候不传参,参数会被认为是默认值 int getValue(int v = 10){ return v; } ~~~ 函数重载 ~~~ double CaculateArea(double x, double y){ return x*y; } double CaculateArea(double r){ return 2*Math.PI*r; // Math.PI是系统自带一个值,就是数学上的π } /* 函数可以同名,但必须满足两个条件,1 函数返回类型相同,2 接收参数的类型或者个数不同 同名函数称之为重载,本例中使用同名函数重载来计算矩形面积和圆面积。 当传入2个参数时,系统会自动使用上面的函数,计算矩形面积,当只传入一个参数,会使用下面的函数,计算圆面积。 */ ~~~ 引用传参 ~~~ void Main(){ int A = 10; GerResult(A, 5); //此时A=15 } //使用ref关键字可以让函数对传入参数直接修改 void GetResult(ref int res, int add){ res = res + add; } ~~~ 返回传参 ~~~ void Main(){ int A = 5; GetResult(18, out 5); } //使用out关键字与ref类似 void GetResult(int add, out int res){ res = res + add; } ~~~ 引用传参和返回传参主要是用来返回多个参数,这种函数自己也可以不是void类型,可以传回一些参数,同时还可以直接修改传入参数并返回修改后的结果。