https://avatars.githubusercontent.com/u/18242685

lihuu's blog

第 12 章:以为 Rust 没有接口?以为没有泛型?

错了!Rust 有的是 Traits 和 Generics,比 Java 的接口和泛型强大一千倍。

Java 的接口系统?20 年前的设计。Rust 的 Trait 系统?21 世纪的现代抽象。

准备好被彻底震撼吧。

Java 接口:功能有限的古董

Java 接口的局限

// Java 接口:只能定义方法签名
interface Drawable {
    void draw();
    // 不能定义字段
    // 不能定义静态方法(Java 8之前)
    // 不能为现有类型实现接口
}

class Circle implements Drawable {
    public void draw() {
        System.out.println("Drawing a circle");
    }
}

问题一览:

第 11 章:你以为换个语言,集合类就换个名字这么简单?

Naive!

Java 的 ArrayListStringHashMap 在 GC 的保护下随便用。Rust 的 VecStringHashMap 每一次操作都要过所有权系统的审查。

这不是负担,这是进化。

Java 集合:GC 庇护下的放纵

Java 的"舒适圈"

// Java 的任性代码
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");

String first = list.get(0);  // 随便取
String copy = new String(first);  // 随便复制
list.clear();  // 随便清空

// GC 负责一切你什么都不用担心

爽吗?当然爽。高效吗?呵呵。

第 10 章:Maven 的 XML 地狱受够了吗?Gradle 的 Groovy 脚本恶心不?

恭喜你,解脱的时候到了。

Cargo 不只是一个构建工具,它是项目管理的终极解决方案。一个工具搞定依赖管理、构建、测试、文档、发布——Maven 和 Gradle 联手都做不到的事情。

是时候见识真正的现代化工具链了。

Java 构建工具:功能强大,体验糟糕

Maven:XML 的噩梦

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>my-app</artifactId>
    <version>1.0.0</version>
    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.12.0</version>
        </dependency>
    </dependencies>
</project>

加个依赖要写这么多垃圾?

第 9 章:你们 Java 程序员最恨什么?

NullPointerException!那个价值"十亿美元的错误",让多少个深夜变成了调试地狱。

还有什么?try-catch 的噩梦!要么用受检异常把方法签名搞得一团糟,要么用非受检异常埋下定时炸弹。

Rust 说:这些垃圾问题,我一个都不要。

Java 错误处理:两个极端的灾难

NPE:运行时的恐怖故事

// Java 的日常灾难
public String getUserName(int id) {
    User user = findUser(id);  // 可能返回 null
    return user.getName();     // 💥 NPE炸弹!
}

你永远不知道哪一行会炸。 防御性编程?写一堆 if (obj != null) 检查?代码变得恶心不说,还不一定管用。

第 8 章:终极 Boss 来了。

前面学的所有权和借用只是开胃菜。生命周期才是 Rust 最变态的部分。

它不会改变你程序的行为,不会提供新功能,它唯一的作用就是:让编译器变得更挑剔。

但掌握了它,你就是真正的 Rust 专家。准备好接受终极挑战了吗?

编译器的困惑时刻

你以为编译器无所不能?天真!

看看这个让编译器"脑子转不过来"的代码:

第 7 章:上一章的痛苦体验过了吗?

所有权系统逼着你转移来转移去,烦死了是不是?

别慌,Rust 不是变态,它是完美主义者。既然给了你世界上最严格的内存管理,自然也要给你最优雅的解决方案。

这就是借用系统——让你在不失去所有权的前提下,优雅地使用数据。

是时候让你见识真正的 Rust 魔法了。

从笨拙到优雅:一个华丽转身

之前的笨拙做法

// 上一章的垃圾代码
fn calculate_length(s: String) -> (String, usize) {
    let length = s.len();
    (s, length)  // 还要把所有权还回去,麻烦死了
}

这种代码写起来想死是不是?

第 6 章:准备好被虐了吗?

前面那些都是开胃菜。现在,真正的 Rust 来了。

所有权系统 —— 这就是 Rust 区别于其他一切语言的核心武器。它不是一个"功能",不是一个"库",而是一套不容违反的物理定律

编译器就是执法官,你就是嫌疑人。

内存管理:三种境界

在我们开始之前,先上一堂"内存管理哲学课":

第 5 章:class 在哪里?

这是每个 Java 程序员学 Rust 问的第一个问题。

答案很残酷:Rust 没有 class。

但先别慌,Rust 不是退步,而是进化。它要用一种更优雅、更安全、更灵活的方式来重新定义"对象"。

你准备好抛弃那些陈旧的面向对象思维了吗?

思维革命:数据与行为的分离

Java 教会了我们什么?数据和行为必须绑定在一个 class 里。