我最近在学 Rust 这门语言,目前学到了 trait 这块,我现在的感受就是这语言看着像 C、C++ 那样稳重,但语法上比 JS 还灵活,玩法也更多。
目前的难点是所有权,让我重新学习了一遍堆/栈上分配的概念,然后由于所有权会转移,让在 JS 中写起来很常见的写法,在 Rust 就会报错,比如:
fn main() {
let s = String::from("Hello");
foo(s);
println!("{s}");
}
fn foo(s: String) {
println!("{s}");
}
谁能想到 s
的所有权被转移到 foo
的作用域了,然后 foo
调用结束后作用域被销毁,连带 s
也被清理了呢?
在 Rust 中这样的写法应该使用引用,让 foo
接受 s
的引用,引用的所有权不会转移,只会借用。
这概念有好处,我理解的就是让数据不会被多个来源同时修改,但也让链表等数据结构的实现变得更加复杂。
另外值得称赞的概念是 trait,他的语法很棒,能在外部对一个现有的结构体/类进行扩展,举一个更加实际的例子:
// 假设我引入了一个结构体 Script,我需要给他添加一个 uglify 的功能
pub trait Format {
fn uglify(&self) -> String;
}
impl Format for Script {
fn uglify(self) -> String {
// 具体实现
}
}
和 Java 的接口不一样,接口还需要动到类原本的代码,但 trait 不需要,只要我能访问你的结构体,我就能通过 trait 进行扩展。如果第三方库提供的功能不全,我都不用再在外层做一份包装,直接扩展他原有的功能就完事了。