forked from PuqiAR/Fig-TreeWalker
文档与readme更新
This commit is contained in:
289
docs/zh_CN/05-函数.md
Normal file
289
docs/zh_CN/05-函数.md
Normal file
@@ -0,0 +1,289 @@
|
||||
# 函数
|
||||
|
||||
## 函数定义
|
||||
|
||||
### 基本语法
|
||||
```go
|
||||
func 函数名(参数列表) -> 返回类型 {
|
||||
函数体
|
||||
}
|
||||
```
|
||||
|
||||
### 示例
|
||||
```go
|
||||
// 简单函数
|
||||
func greet() -> Null {
|
||||
io.println("Hello!");
|
||||
}
|
||||
|
||||
// 带参数的函数
|
||||
func add(a: Int, b: Int) -> Int {
|
||||
return a + b;
|
||||
}
|
||||
|
||||
// 省略返回类型(默认为 Any)
|
||||
func say(message: String) {
|
||||
io.println(message);
|
||||
// 没有 return,返回 null
|
||||
}
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
### 必需参数
|
||||
```go
|
||||
func power(base: Double, exponent: Double) -> Double {
|
||||
return base ** exponent;
|
||||
}
|
||||
```
|
||||
|
||||
### 默认参数
|
||||
参数可以指定默认值:
|
||||
```go
|
||||
func createPerson(name: String, age: Int = 18) -> Null {
|
||||
io.println(name + " is " + age + " years old");
|
||||
}
|
||||
|
||||
// 调用
|
||||
createPerson("Alice"); // 使用默认 age=18
|
||||
createPerson("Bob", 25); // 指定 age=25
|
||||
```
|
||||
|
||||
### 可变参数
|
||||
使用 `...` 表示可变参数,接收一个 List:
|
||||
```go
|
||||
func sum(numbers...) -> Int {
|
||||
var total = 0;
|
||||
var i = 0;
|
||||
for i = 0; i < numbers.length(); i = i + 1 {
|
||||
total = total + numbers.get(i);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
// 调用
|
||||
sum(1, 2, 3); // 返回 6
|
||||
sum(1, 2, 3, 4, 5); // 返回 15
|
||||
```
|
||||
|
||||
可变参数不支持类型限制,获取到的总是 List 类型。
|
||||
|
||||
## 返回值
|
||||
|
||||
### 显式返回
|
||||
使用 `return` 语句返回值:
|
||||
```go
|
||||
func max(a: Int, b: Int) -> Int {
|
||||
if a > b {
|
||||
return a;
|
||||
} else {
|
||||
return b;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 无返回值
|
||||
函数如果没有 return 语句,返回 null:
|
||||
```go
|
||||
func log(message: String) -> Null {
|
||||
io.println("[LOG] " + message);
|
||||
// 函数结束,返回 null
|
||||
}
|
||||
|
||||
func process(data: List) {
|
||||
if data.length() == 0 {
|
||||
return; // 提前返回 null
|
||||
}
|
||||
// 处理数据...
|
||||
// 函数结束,返回 null
|
||||
}
|
||||
```
|
||||
|
||||
## 函数作为值
|
||||
|
||||
### 函数赋值
|
||||
函数是一等公民,可以赋值给变量:
|
||||
```go
|
||||
var addFunc = func(a: Int, b: Int) -> Int {
|
||||
return a + b;
|
||||
};
|
||||
|
||||
// 调用
|
||||
var result = addFunc(3, 4); // result = 7
|
||||
```
|
||||
|
||||
### 函数作为参数
|
||||
```go
|
||||
func applyOperation(x: Int, y: Int, op: Function) -> Int {
|
||||
return op(x, y);
|
||||
}
|
||||
|
||||
func multiply(a: Int, b: Int) -> Int {
|
||||
return a * b;
|
||||
}
|
||||
|
||||
// 调用
|
||||
var product = applyOperation(3, 4, multiply); // product = 12
|
||||
```
|
||||
|
||||
### 函数作为返回值
|
||||
```go
|
||||
func makeMultiplier(factor: Int) -> Function {
|
||||
return func(x: Int) -> Int {
|
||||
return x * factor;
|
||||
};
|
||||
}
|
||||
|
||||
// 调用
|
||||
var double = makeMultiplier(2);
|
||||
var triple = makeMultiplier(3);
|
||||
|
||||
io.println(double(5)); // 输出 10
|
||||
io.println(triple(5)); // 输出 15
|
||||
```
|
||||
|
||||
## 匿名函数
|
||||
|
||||
### Lambda 表达式
|
||||
```go
|
||||
// 完整形式
|
||||
var square = func(x: Int) {
|
||||
return x * x;
|
||||
};
|
||||
|
||||
// 简写形式(单表达式)
|
||||
var squareShort = func(x: Int) => x * x;
|
||||
|
||||
// 调用
|
||||
io.println(square(5)); // 输出 25
|
||||
io.println(squareShort(5)); // 输出 25
|
||||
```
|
||||
|
||||
### 立即调用函数表达式
|
||||
```go
|
||||
var result = func(x: Int, y: Int){
|
||||
return x + y;
|
||||
}(3, 4); // result = 7
|
||||
```
|
||||
|
||||
## 闭包
|
||||
|
||||
### 捕获外部变量
|
||||
函数可以捕获其定义作用域中的变量:
|
||||
```go
|
||||
func makeCounter() -> Function {
|
||||
var count = 0;
|
||||
|
||||
return func(){
|
||||
count = count + 1;
|
||||
return count;
|
||||
};
|
||||
}
|
||||
|
||||
// 使用
|
||||
var counter = makeCounter();
|
||||
io.println(counter()); // 输出 1
|
||||
io.println(counter()); // 输出 2
|
||||
io.println(counter()); // 输出 3
|
||||
```
|
||||
|
||||
每个闭包有自己独立的捕获变量:
|
||||
```go
|
||||
var c1 = makeCounter();
|
||||
var c2 = makeCounter();
|
||||
|
||||
io.println(c1()); // 输出 1
|
||||
io.println(c1()); // 输出 2
|
||||
io.println(c2()); // 输出 1(独立的计数)
|
||||
```
|
||||
|
||||
## 递归函数
|
||||
|
||||
函数可以调用自身:
|
||||
```go
|
||||
func factorial(n: Int) -> Int {
|
||||
if n <= 1 {
|
||||
return 1;
|
||||
}
|
||||
return n * factorial(n - 1);
|
||||
}
|
||||
|
||||
// 调用
|
||||
io.println(factorial(5)); // 输出 120
|
||||
```
|
||||
|
||||
### 嵌套函数定义
|
||||
```go
|
||||
func outer(x: Int) -> Int {
|
||||
func inner(y: Int) -> Int {
|
||||
return y * 2;
|
||||
}
|
||||
|
||||
return inner(x) + 1;
|
||||
}
|
||||
|
||||
// 调用
|
||||
io.println(outer(10)); // 输出 21
|
||||
```
|
||||
|
||||
## 函数调用
|
||||
|
||||
### 普通调用
|
||||
```go
|
||||
func calculate(a: Int, b: Int, c: Int) -> Int {
|
||||
return a + b * c;
|
||||
}
|
||||
|
||||
// 位置参数调用
|
||||
var result = calculate(1, 2, 3); // 1 + 2*3 = 7
|
||||
```
|
||||
|
||||
### 方法调用语法
|
||||
对象的方法调用:
|
||||
```go
|
||||
var list = [1, 2, 3];
|
||||
var length = list.length(); // 方法调用
|
||||
```
|
||||
|
||||
## 函数示例
|
||||
|
||||
### 实用函数组合
|
||||
```go
|
||||
import std.io;
|
||||
|
||||
// 高阶函数示例
|
||||
func compose(f: Function, g: Function) -> Function {
|
||||
return func(x: Any) -> Any {
|
||||
return f(g(x));
|
||||
};
|
||||
}
|
||||
|
||||
// 使用
|
||||
func addOne(x: Int) -> Int {
|
||||
return x + 1;
|
||||
}
|
||||
|
||||
func double(x: Int) -> Int {
|
||||
return x * 2;
|
||||
}
|
||||
|
||||
var addThenDouble = compose(double, addOne);
|
||||
io.println(addThenDouble(5)); // (5+1)*2 = 12
|
||||
```
|
||||
|
||||
### 回调函数模式
|
||||
```go
|
||||
func processData(data: List, callback: Function) -> Null {
|
||||
var i = 0;
|
||||
for i = 0; i < data.length(); i = i + 1 {
|
||||
var result = callback(data.get(i));
|
||||
io.println("处理结果: " + result);
|
||||
}
|
||||
}
|
||||
|
||||
// 使用
|
||||
var numbers = [1, 2, 3, 4, 5];
|
||||
processData(numbers, func(x){
|
||||
return x * x;
|
||||
});
|
||||
```
|
||||
Reference in New Issue
Block a user