如果你熟悉 TypeScript 的 interface,那你理解 Trait 会非常快。
Trait 定义了一种 “共同的行为”。它告诉编译器:不管你是什么类型(Struct),只要你实现了这个 Trait,你就肯定能做这件事。
1.定义一个 Trait
假设我们要处理各种各样的内容:推文 (Tweet)、新闻文章 (NewsArticle)。它们内部的数据结构完全不同,但我们希望它们都能 “被总结” (Summarize)。
我们可以定义一个 Trait:
1 | |
这就像在 TS 里写 interface Summary { summarize(): string; }。
2.实现 Trait (Impl)
现在我们把这个特质“贴”到具体的 Struct 上。
1 | |
看,虽然 Tweet 和 NewsArticle 长得不一样,但它们都能调用 .summarize()!
🧠 随堂小测验
Trait 最强大的地方在于它可以作为 函数的参数类型。这实现了 多态 (Polymorphism)。
假设我想写一个函数 notify,它的作用是把任何能“总结”的东西打印出来。
在 TypeScript 里,你可能会写:
1 | |
在 Rust 里,我们需要一种特殊的语法来表示 “任何实现了 Summary 的东西”。
请观察下面两种写法,你觉得哪一种是合法的 Rust 语法?
A.
1 | |
B.
1 | |
(提示:Rust 的编译器需要在编译时确定变量的大小,Trait 本身不是一个具体的类型,而是一个行为约束。)