【图书介绍】《Rust编程与项目实战》-CSDN博客
《Rust编程与项目实战》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 (jd.com)
Rust编程与项目实战_夏天又到了的博客-CSDN博客
7.1 函 数 定 义
在Rust中,函数使用fn关键字定义,后跟函数名、参数列表、返回类型和函数体。函数体由一系列语句组成,用于执行特定的操作和计算。以下是一个简单的函数示例:
fn greet() {
println!("Hello, Rust!");
}
fn main() {
greet();
}
上述示例中,我们定义了一个名为greet的函数,它不接收任何参数,也没有返回值。函数体中的语句println!("Hello, Rust!")用于打印一条问候信息。在main函数中,我们调用了greet函数,通过函数名后加上圆括号“()”来调用函数。
7.2 函 数 参 数
函数可以接收参数,参数是函数的输入数据,用于在函数体中进行处理和操作。在Rust中,函数的参数由参数名和类型组成,并通过逗号分隔。以下是一个带有参数的函数示例:
fn greet(name: &str) {
println!("Hello, {}!", name);
}
fn main() {
let name = "Alice";
greet(name);
}
在上述示例中,我们定义了一个名为greet的函数,它接收一个类型为&str的参数name。参数类型&str表示一个字符串切片,它是对字符串的引用。
在main函数中,我们定义了一个名为name的变量,并将其赋值为"Alice"。然后,我们将name作为参数传递给greet函数,以打印问候信息。
7.3 函数返回值
函数可以返回一个值,返回值是函数的输出结果,用于提供函数执行后的结果或计算的值。在Rust中,函数的返回类型由->符号后跟类型来指定。以下是一个带有返回值的函数示例:
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let result = add(3, 5);
println!("Result: {}", result);
}
在上述示例中,我们定义了一个名为add的函数,它接收两个参数a和b,类型均为i32。函数体中的表达式a + b表示将参数a和b相加,并作为函数的返回值。
在main函数中,我们调用了add函数,并将返回值存储在result变量中。然后,使用println!宏打印出结果。结果输出:Result: 8。
7.4 函 数 重 载
Rust不支持传统意义上的函数重载,即在同一作用域中定义多个同名函数但参数类型或数量不同的情况。然而,Rust通过使用泛型和trait来实现类似的功能。以下是一个使用泛型和trait实现函数重载的示例:
trait Add {
type Output;
fn add(self, other: Self) -> Self::Output;
}
impl Add for i32 {
type Output = i32;
fn add(self, other: Self) -> Self::Output {
self + other
}
}
impl Add for f64 {
type Output = f64;
fn add(self, other: Self) -> Self::Output {
self + other
}
}
fn main() {
let a = 3;
let b = 5;
let c = 2.5;
let d = 4.8;
let result1 = a.add(b);
let result2 = c.add(d);
println!("Result 1: {}", result1);
println!("Result 2: {}", result2);
}
println!("Result 1: {}", result1);
println!("Result 2: {}", result2);
}
在上述示例中,我们定义了一个名为Add的trait,它具有一个关联类型Output和一个add方法。然后,为i32和f64类型分别实现了Add trait,为它们提供了不同的实现方式。
在main函数中,我们分别定义了a、b、c和d四个变量,并使用add方法对它们进行相加操作。根据变量的类型,编译器会自动选择正确的实现方式。运行结果如下:
Result 1: 8
Result 2: 7.3
7.5 函数作为参数和返回值
在Rust中,函数可以作为参数传递给其他函数,也可以作为函数的返回值。这种特性可以实现函数的灵活组合和高阶函数的编写。以下是一个函数作为参数和返回值的示例:
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn subtract(a: i32, b: i32) -> i32 {
a - b
}
fn calculate(op: fn(i32, i32) -> i32, a: i32, b: i32) -> i32 {
op(a, b)
}
fn main() {
let result1 = calculate(add, 3, 5);
let result2 = calculate(subtract, 8, 4);
println!("Result 1: {}", result1);
println!("Result 2: {}", result2);
}
在上述示例中,我们定义了两个简单的函数add和subtract,分别用于相加和相减操作。
然后,我们定义了一个名为calculate的函数,它接收一个函数参数op,类型为fn(i32, i32) -> i32,表示接收两个i32类型的参数并返回i32类型结果。在函数体中,我们调用了op函数,并传递了a和b作为参数。
在main函数中,我们分别使用add和subtract作为calculate函数的参数,并打印出计算结果。运行结果如下:
Result 1: 8
Result 2: 4