Menu
CoddyTech

关联函数

本课属于 Coddy Rust 学习旅程的“面向对象编程”单元。第 4 课,共 61 课。

impl 块中的函数不一定都需要对现有实例进行操作。不将 self 作为参数的函数称为关联函数:它们与类型本身相关联,而不是与任何特定实例相关联。

关联函数最常见的用途是创建构造函数。按照惯例,这些函数通常命名为 new:

struct Player {
    name: String,
    score: u32,
}

impl Player {
    fn new(name: String) -> Player {
        Player {
            name,
            score: 0,
        }
    }
}

注意,这里没有 self 参数。这个函数不需要已有的 Player 就能运行。相反,它会创建并返回一个全新的对象。返回类型就是结构体本身。

要调用关联函数,请使用 :: 语法,并在其中使用类型名称,而不是点表示法:

fn main() {
    let player1 = Player::new(String::from("Alice"));
    
    println!("{} starts with {} points", player1.name, player1.score);
    // 输出:Alice starts with 0 points
}

这种模式提供了一种简洁的方式来使用默认值或验证逻辑初始化结构体,并将创建逻辑与类型定义放在一起。你可能已经见过 String::from() 这种语法:它也是一个关联函数!

challenge icon

挑战

简单

创建一个包含两个字段的 Book 结构体:title(String)和 pages(u32)。

为 Book 添加一个实现块,其中包含一个名为 new 的关联函数,该函数:

  • 接收一个 title: String 参数
  • 返回一个新的 Book,其中包含给定的标题,并将 pages 设为 0

另外,添加一个名为 info 的方法,该方法接收 &self,并按以下格式返回一个 String:"{title} has {pages} pages"

你将收到一个输入:

  • 书名(String)

使用 Book::new 关联函数创建一本书,并传入给定的书名,然后打印调用 info 方法的结果。

预期输出格式:

{title} has {pages} pages

亲手试试

use std::io;

// TODO: 定义 Book 结构体,包含 title(String)和 pages(u32)字段


// TODO: 为 Book 添加 impl 代码块,其中包含:
// - 一个关联函数 `new`,接收标题并返回 pages 设为 0 的 Book
// - 一个方法 `info`,返回格式为 "{title} has {pages} pages" 的 String


fn main() {
    let mut input = String::new();
    io::stdin().read_line(&mut input).expect("Failed to read line");
    let title = input.trim().to_string();

    // TODO: 使用 Book::new,根据提供的标题创建一本书
    // TODO: 输出调用 info 方法的结果
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

面向对象编程中的所有课

自己练习: Rust 在线编译器