大家好,我是梦兽编程。欢迎回来与梦兽编程一起刷Rust的系列。
这是由 Google 的 Android开拓团队的分享Rust课程。本课程涵盖了 Rust 的方方面面,从基本语法到泛型和缺点处理等高等主题。
该课程的最新版本可以在 https://google.github.io/comprehensive-rust/[1]找到。如果您正在其他地方阅读,请检讨那里的更新。

如果你喜好看梦兽编程的版本可以订阅随着谷歌安卓团队学Rust订阅最新内容,梦兽编程也期待大家关注我的个人网站。
加入梦兽编程微信群,"大众年夜众号回答111即可。
面向工具当我们评论辩论面向工具编程时,我们关注的是如何组织代码和数据,以及如何利用这些代码和数据。
面向工具编程将数据和操作数据的代码封装在一起,形成一个称为工具的单元。工具可以具有属性(数据)和方法(操作)。通过创建工具,我们可以仿照现实天下中的事物或观点,并通过工具之间的交互来办理问题。
面向工具编程的核心观点包括封装、继续和多态。
面向工具编程的目标是将繁芜的问题分解为大略的工具,并通过工具之间的交互来办理问题。它供应了一种组织和管理代码的有效办法,并且可以提高代码的可读性、可掩护性和可重用性。
struct构造体 (struct),Rust 与 golang 措辞类似没有供应class关键词。同样供应了struct,但是在rust中通过构造体 (struct) 和 trait(trait)来实现面向工具的特性。
与c++/c不一样的地方是:
Rust引入了所有权系统和借用检讨器,以确保内存安全和避免数据竞争。这导致Rust在编写面向工具代码时须要更多的把稳事变,例如处理生命周期和借用规则。
封装struct Circle { radius: f64,}impl Circle { fn new(radius: f64) -> Self { Circle { radius } } fn area(&self) -> f64 { std::f64::consts::PI self.radius self.radius }}fn main() { let circle = Circle::new(3.0); println!("Area of the circle: {}", circle.area());}
与其他措辞一样,rust中的“类”(class)也是拥有方法的功能。只不过rust中须要利用impl再定义一次。你可以这么认为struct定义“类”的属性。impl实现它的方法。这样做的好处是可以开拓分离。如果你要在其他措辞系统中实现以上代码大概如下:
// java 已经忘得差不多了不要见怪class CircleAbstract { float radius = 0;}class Circle extends CircleAbstract { Circle(float radius) { this.radius = radius; } public area() { return PI this.radius this.radius; }}
如果你有洁癖须要分开两个文件来写的,在其他措辞中估计是须要这样实现。这样比拟下来是不是觉得rust会相对大略一点?
继续 & 多态继续是面向工具的第二特性,它许可一个类(称为子类或派生类)从另一个类(称为父类或基类)继续属性和方法。子类可以从父类继续其所有的非私有成员,包括变量和方法。通过继续,子类可以重用父类的代码,并且可以在其根本上进行扩展或修正。
// 这里利用interface是由于多态interface Animal { void makeSound();}class Dog implements Animal { @Override public void makeSound() { System.out.println("Woof!"); }}class Cat implements Animal { @Override public void makeSound() { System.out.println("Meow!"); }}public class Main { public static void main(String[] args) { Animal dog = new Dog(); Animal cat = new Cat(); dog.makeSound(); cat.makeSound(); }}
在java措辞中,我们须要利用interface来约束未来class的实现。在rust中只不过把interface改成trait,implements改为for。然后继续的写法上是反过来。
trait Animal { fn make_sound(&self);}struct Dog;impl Animal for Dog { fn make_sound(&self) { println!("Woof!"); }}struct Cat;impl Animal for Cat { fn make_sound(&self) { println!("Meow!"); }}fn main() { let dog = Dog; let cat = Cat; dog.make_sound(); cat.make_sound();}
多态的浸染/好处
在逼迫类型措辞中,多态显得非常主要。如果你利用js/php。这个再利用的过程中完备可以忽略,由于javascript万物皆可json,php中万物皆可array。但是再逼迫类型措辞中,不同的类型是不能放在一起,为理解决这个问题引入了多态。还是上面的的例子进行改造。
我们先定义两个构造体Dog,Cat。然后分别定义一个trait接口Pet,分别继续Pet接口。Vec这个暂时可以理解,这个可以理解成Java里面的ArrayList那玩意,后面进入高等的时候会详细再先容。
struct Dog { name: String, age: i8 }struct Cat { lives: i8 } // No name needed, cats won't respond anyway.trait Pet { fn talk(&self) -> String;}impl Pet for Dog { fn talk(&self) -> String { format!("Woof, my name is {}!", self.name) }}impl Pet for Cat { fn talk(&self) -> String { String::from("Miau!") }}fn main() { // 定义一个可变的数组凑集 let pets: Vec<Box<dyn Pet>> = vec![ Box::new(Cat { lives: 9 }), Box::new(Dog { name: String::from("Fido"), age: 5 }), ]; for pet in pets { println!("Hello, who are you? {}", pet.talk()); }}
Deriving
在 Rust 中,"Deriving" 是一种自动为构造体或列举类型实现特定 trait 的机制。通过利用 "derive" 表明,开拓职员可以自动为类型实现一些常见的 trait,而不须要手动编写实当代码。
"Deriving" 机制的目的是减少开拓职员的重复劳动,使得实现一些常用 trait 的过程更加大略和高效。例如,通过添加 #[derive(Debug)] 表明,Rust 编译器会自动为构造体或列举类型实现 Debug trait,使得我们可以通过 println! 宏打印出这些类型的调试信息。
除了 Debug trait,Rust 还供应了其他一些可以利用 "derive" 表明自动实现的 trait,如 Clone、Copy、PartialEq、Eq、PartialOrd、Ord 等。这些 trait 在实现某些功能时非常常见,因此通过 "derive" 机制可以大大简化代码编写过程。
须要把稳的是,并非所有的 trait 都可以通过 "derive" 机制来自动实现,只有 Rust 标准库中预定义的一些 trait 才支持这种自动实现机制。如果须要实现的 trait 不在预定义的列表中,开拓职员仍旧须要手动编写实当代码。
#[derive(Debug, Clone, Default)]struct Player { name: String, strength: u8, hit_points: u8,}fn main() { let p1 = Player::default(); // Default trait adds `default` constructor. let mut p2 = p1.clone(); // Clone trait adds `clone` method. p2.name = String::from("EldurScrollz"); // Debug trait adds support for printing with `{:?}`. println!("{:?} vs. {:?}", p1, p2);}
比如我们在这个构造体中添加了Clone,Default的能力。我们的p1工具就拥有了default设置默认值的方法,还有clone的方法。
总结以上便是Rust面向工具的所有内容啦,当然这些这是让你快速入门。如果你想理解关于它是如何实现,内存机制等等比较深入的东西。建议你去看《Rust圣经》。
https://rexweb.link/category/technical-column/learn-rust-from-the-android-team[2]或者更多技能可以收藏梦兽编程https://rexweb.link[3]
梦兽编程倔强号梦兽编程知乎梦兽编程bilibili微信搜索梦兽编程"大众号,发送111即可加入互换群与梦兽编程一起互换。
参考资料[1]
https://google.github.io/comprehensive-rust/: https://google.github.io/comprehensive-rust/
[2]
随着谷歌团队学Rust: https://rexweb.link/category/technical-column/learn-rust-from-the-android-team
[3]
梦兽编程: https://rexweb.link