## 函数(方法)
或许是我对函数和方法的认识不够深入,我通常管它叫函数,但很多人也称之为方法。
我发现,说的其实都是这个东西。
在本节,我会统一称之为函数。
先抛出一个例子
~~~
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类型,可以传回一些参数,同时还可以直接修改传入参数并返回修改后的结果。
- 序言
- 写在前面的话
- 太空工程师
- MEA小组
- 一、入门
- 1.1 基础概念
- 1.2 编程工具
- 1.3 变量
- 1.4 函数 Function
- 1.5 基本语法
- 1.5.1 运算符
- 1.5.2 if
- 1.5.3 for
- 1.5.4 其他语法
- 1.3 类 Class
- 二、编程块
- 2.1 方块的概念
- 2.2 List<T>结构
- 2.3 获取方块
- 2.4 方块的使用
- 三、Ship 类
- 3.1 简介
- Ship v0.5
- 代码
- 手册(待更新)
- 例子(待更新)
- Ship v1.0
- 代码
- 例子
- 文档
- 实例化
- 内置变量
- 内置方法
- Target类
- 四、运动控制算法在SE中的应用
- 4.1 运动控制介绍
- 4.2 过程控制
- 4.3 震荡和动态误差
- 4.4 误差累加方案
- 4.5 PID算法
- 4.6 对PID算法的一点点简化
- 4.7 一阶惯性系统的PID算法优化的研究
- 五、MEA方块类
- 5.0 核心代码目录
- v1.0核心代码
- v1.1 核心代码
- v2.0 核心代码
- 5.1 类的概念
- 5.2 MEA的方块类(Block)
- 5.3 方块类文档
- 5.4 方块类2.0 全教程
- 5.4.1 安装和使用
- 5.4.2 方块类(Block)
- 5.4.3 显示屏类(DisplayScreen)
- 5.4.4 LCD类(LCD)
- 5.4.5 主控座椅类(Cockpit)
- 六、疯猴的编程笔记
- 第一个程序
- 获取和控制其他块
- 物流与生产
- 界面与通信
- 运动与姿态
- 侦测与导航
- 七、SteamZhou的笔记
- 有趣而花里胡哨的IDEA
- 八、质子对撞炮的笔记
- 属性 Property
- 接口 interface