函数基础 #
一、函数定义 #
1.1 基本语法 #
使用 fn 关键字定义函数:
rust
fn greet() {
println!("Hello, Rust!");
}
fn main() {
greet();
}
1.2 函数位置 #
函数可以定义在任意位置:
rust
fn main() {
greet(); // 可以调用后面定义的函数
}
fn greet() {
println!("Hello!");
}
二、函数参数 #
2.1 参数定义 #
rust
fn greet(name: &str) {
println!("Hello, {}!", name);
}
fn main() {
greet("Alice");
}
2.2 多个参数 #
rust
fn print_info(name: &str, age: u32) {
println!("{} is {} years old", name, age);
}
fn main() {
print_info("Alice", 30);
}
2.3 参数类型 #
必须显式标注参数类型:
rust
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let result = add(5, 3);
println!("Result: {}", result);
}
三、返回值 #
3.1 返回值类型 #
使用 -> 指定返回值类型:
rust
fn add(a: i32, b: i32) -> i32 {
a + b
}
fn main() {
let sum = add(5, 3);
println!("Sum: {}", sum);
}
3.2 return 关键字 #
使用 return 提前返回:
rust
fn abs(x: i32) -> i32 {
if x < 0 {
return -x;
}
x
}
fn main() {
println!("abs(-5) = {}", abs(-5));
println!("abs(5) = {}", abs(5));
}
3.3 表达式返回 #
最后一个表达式作为返回值(无分号):
rust
fn add(a: i32, b: i32) -> i32 {
a + b // 无分号,作为返回值
}
fn add_with_semicolon(a: i32, b: i32) -> i32 {
return a + b; // 使用 return
}
3.4 无返回值 #
无返回值函数返回单元类型 ():
rust
fn greet(name: &str) {
println!("Hello, {}!", name);
}
// 等价于
fn greet_explicit(name: &str) -> () {
println!("Hello, {}!", name);
}
四、语句与表达式 #
4.1 语句 #
语句执行操作,不返回值:
rust
fn main() {
let x = 5; // 语句
}
4.2 表达式 #
表达式返回值:
rust
fn main() {
let y = {
let x = 3;
x + 1 // 表达式,返回 4
};
println!("y = {}", y);
}
4.3 区别 #
rust
fn main() {
let x = 5;
// 表达式(无分号)
let y = {
x + 1
};
println!("y = {}", y); // 6
// 语句(有分号)
let z = {
x + 1; // 返回 ()
};
println!("z = {:?}", z); // ()
}
五、所有权与函数 #
5.1 值传递 #
传递值会转移所有权:
rust
fn take_ownership(s: String) {
println!("{}", s);
}
fn main() {
let s = String::from("hello");
take_ownership(s);
// println!("{}", s); // 错误:s 已移动
}
5.2 引用传递 #
传递引用不转移所有权:
rust
fn borrow_string(s: &String) {
println!("{}", s);
}
fn main() {
let s = String::from("hello");
borrow_string(&s);
println!("{}", s); // 正确:s 仍然有效
}
5.3 可变引用 #
rust
fn append_world(s: &mut String) {
s.push_str(", world");
}
fn main() {
let mut s = String::from("hello");
append_world(&mut s);
println!("{}", s); // hello, world
}
5.4 返回所有权 #
rust
fn give_ownership() -> String {
String::from("hello")
}
fn take_and_return(s: String) -> String {
s
}
fn main() {
let s1 = give_ownership();
println!("{}", s1);
let s2 = take_and_return(s1);
// println!("{}", s1); // 错误:s1 已移动
println!("{}", s2);
}
六、实践示例 #
6.1 数学函数 #
rust
fn square(x: i32) -> i32 {
x * x
}
fn cube(x: i32) -> i32 {
x * x * x
}
fn factorial(n: u32) -> u32 {
if n <= 1 {
1
} else {
n * factorial(n - 1)
}
}
fn main() {
println!("square(5) = {}", square(5));
println!("cube(3) = {}", cube(3));
println!("factorial(5) = {}", factorial(5));
}
6.2 字符串处理 #
rust
fn first_word(s: &str) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
fn main() {
let s = "hello world";
let word = first_word(s);
println!("第一个单词: {}", word);
}
6.3 结构体方法 #
rust
struct Rectangle {
width: u32,
height: u32,
}
impl Rectangle {
fn new(width: u32, height: u32) -> Self {
Rectangle { width, height }
}
fn area(&self) -> u32 {
self.width * self.height
}
fn scale(&mut self, factor: u32) {
self.width *= factor;
self.height *= factor;
}
}
fn main() {
let mut rect = Rectangle::new(10, 20);
println!("面积: {}", rect.area());
rect.scale(2);
println!("缩放后面积: {}", rect.area());
}
七、总结 #
本章学习了:
- 函数定义语法
- 参数和返回值
- 语句与表达式
- 所有权与函数
- 函数调用
下一章,我们将学习参数与返回值的更多细节。
最后更新:2026-03-27