「随想」关于 Rust

「随想」关于 Rust

·

1 min read

我最近在学 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 进行扩展。如果第三方库提供的功能不全,我都不用再在外层做一份包装,直接扩展他原有的功能就完事了。