首页 » PHP教程 » 梦中php系列教程技巧_跟着谷歌安卓团队学Rust 面向对象的核心结构体的具体入门你

梦中php系列教程技巧_跟着谷歌安卓团队学Rust 面向对象的核心结构体的具体入门你

访客 2024-11-20 0

扫一扫用手机浏览

文章目录 [+]

大家好,我是梦兽编程。
欢迎回来与梦兽编程一起刷Rust的系列。

这是由 Google 的 Android开拓团队的分享Rust课程。
本课程涵盖了 Rust 的方方面面,从基本语法到泛型和缺点处理等高等主题。

梦中php系列教程技巧_跟着谷歌安卓团队学Rust  面向对象的核心结构体的具体入门你

该课程的最新版本可以在 https://google.github.io/comprehensive-rust/[1]找到。
如果您正在其他地方阅读,请检讨那里的更新。

梦中php系列教程技巧_跟着谷歌安卓团队学Rust  面向对象的核心结构体的具体入门你
(图片来自网络侵删)

如果你喜好看梦兽编程的版本可以订阅随着谷歌安卓团队学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

标签:

相关文章

执业药师试卷代码解码药师职业发展之路

执业药师在药品质量管理、用药安全等方面发挥着越来越重要的作用。而执业药师考试,作为进入药师行业的重要门槛,其试卷代码更是成为了药师...

PHP教程 2025-02-18 阅读0 评论0

心灵代码主题曲唤醒灵魂深处的共鸣

音乐,作为一种独特的艺术形式,自古以来就承载着人类情感的表达与传递。心灵代码主题曲,以其独特的旋律和歌词,唤醒了无数人的灵魂深处,...

PHP教程 2025-02-18 阅读0 评论0

探寻福建各市车牌代码背后的文化内涵

福建省,地处我国东南沿海,拥有悠久的历史和丰富的文化底蕴。在这片充满魅力的土地上,诞生了许多具有代表性的城市,每个城市都有自己独特...

PHP教程 2025-02-18 阅读0 评论0

探寻河北唐山历史与现代交融的城市之光

河北省唐山市,一座地处渤海之滨,拥有悠久历史和独特文化的城市。这里既是古丝绸之路的起点,也是中国近代工业的发源地。如今,唐山正以崭...

PHP教程 2025-02-18 阅读0 评论0