Rust学习

并发

Rust无畏并发:允许编写没有细微BUG的代码,并在不引入新BUG的情况下易于重构

多线程

实现多线程的方式:使用Os的Api创建线程, 1:1模型,2.语言自己实现的线程, M:N模型

Rust标准库仅提供1:1线程模型,通过Thread::spawn创建新线程,参数为闭包(新线程中运行的代码

fn main() {
    let a = || {
        loop {
            println!("我是子进程");
            // 暂停两秒
            thread::sleep(Duration::from_secs(2));
        }
    };
    let son_thread = thread::spawn(a);
    loop {
        println!("我是父进程");
        thread::sleep(Duration::from_secs(1));
    }
    // join干哈的我就不多说了
    son_thread.join();
}
我是父进程
我是子进程
我是父进程
我是父进程

必报的子线程可以贡献同一作用域下的其他线程参数,这是闭包的特性哦应该没有忘记把。但是在多线程中我们还需要Move来传递参数

fn main() {
    let data = String::from("我是主线程数据");
    // let a = move || {
    let a = || {
            println!("获取主线程的数据: {}", data);
    };
    let son_thread = thread::spawn(a);
    son_thread.join();
}
let a = || {
   |             ^^ may outlive borrowed value `data`
8  |             println!("获取主线程的数据: {}", data);
   |                                               ---- `data` is borrowed here

这里的报错的意思指:我们在子线程中调用的这个数据可能在子线程运行完毕之前就被del了,Rust编译器连这都想到了确实很细致。我们如果一定要获得参数的化使用Move 获取此参数的所有权即可

消息传递

消息传递是一种很流行的保证安全并发的线程通讯技术。线程彼此之间通过发送消息完成通讯。可以理解为Python中的携程

Rust 使用Channel(标准库提供)实现进程通讯。Channel包含发送端域接收单,调用发送端的方法就是发送数据,接收端会检查和接受收到的数据。如果发送,接受任意一端被丢弃,Channel就关闭了

使用mpsc::channel创建Channel (多个生产者,一个消费者), 返回一个元组,一个发送端,一个接收端。

fn main() {
    let (sender,receiver) = mpsc::channel();
    let a = move || {
        loop {
            //返回Result<T,E>, 有问题就甩Err
            sender.send(String::from("Hello"));
            // 这里如果上面发送的是变量的化,那所有权已经在receiver手里了
            println!("获取主线程发送数据: Hello");
            thread::sleep(Duration::from_secs(1));
        }
    };
    let son_thread = thread::spawn(a);
    loop {
        // 阻塞当前线程知道Channel中有值送到, 发送端关闭则返回错误
        let data = receiver.recv().unwrap();
        println!("收到数据: {}",data);
    }
    son_thread.join();
}
收到数据: Hello
获取主线程发送数据: Hello
获取主线程发送数据: Hello
收到数据: Hello

对于发送者,我们可以使用克隆创建多个发送者,毕竟是多生产者单消费者

共享状态的并发

这一节讲的就是锁,利用Mutex<T,E> 进行上锁,并使用ARC<T>使其s拥有多重所有权.我的评价是不如通讯、不如携程。

ooj 面向对象

面向对象不是简单的有类有函数就OJBK了, 面向对象三大特性最少要保证吧:封装,继承,堕胎。关于Rust的面向对象特性其实是一个比较矛盾的存在。

  • 封装:调用对象外部的代码无法直接访问对象内部的实现细节,唯一与对象交互的方法就是公开的API. Rust中我们引用的时候不是只能引用被pub修饰的方法,或者说mod么,在这种情况下我们可以认为Rust是具有封装特性的
  • Rust中没有继承的概念。继承的目的主要是代码复用较少代码量, 但是Rust未见过啥结构体,枚举类型继承的情况。Rust本身虽然没有复用,但是我们可以使用trait定义加上泛形试下代码的共享 。同时我们可以覆盖已经实现的trait, 只能说实现了一定程度的继承。
  • 多态:Rust中使用泛形和trait约束限定多态。

trait对象其实更多像接口或抽象类定义,在我们上一张学了Box之后就可以采用Box进行泛化了。BOx进行泛化保证同一个Vec中可以存储不同类型, 这种派发与普通的trait泛形约束相比较属于动态派发,无法在编译时确定类型。对于这种trait,Rust限定了两条法则保证安全

  1. 方法的返回类型是Self
  2. 方法中不包含任何泛形类型参数
// 一个泛形的例子
use crate::type2::Name2;

trait whoami{
    fn print_my_type(&self);
}
struct  type1{
    Name1:String,
}

impl whoami for type1 {
    fn print_my_type(&self) {
        println!("I'm type1");
    }
}
enum type2{
    Name2(Vec<String>),
}

impl whoami for type2 {
    fn print_my_type(&self) {
        println!("I'm type 2")
    }
}

struct type_done_whoami_trait{
    // 完成了vec的都可以放到type_vec中
    type_vec:Vec<Box<dyn whoami>>,
}

impl type_done_whoami_trait{
    fn new() -> type_done_whoami_trait{
        let a = type1{ Name1: String::new()};
        let c = type1{ Name1: String::new()};
        let b = type2::Name2(vec![String::new()]);
        type_done_whoami_trait {
            type_vec: vec![Box::new(a),Box::new(b),Box::new(c)]
        }
    }
}

fn main() {
    let c = type_done_whoami_trait::new();
    for p in c.type_vec{
        // 这里直接 p.print_my_type()也是可以的
        (*p).print_my_type();
    }
}

经典面向对象的模式不适合Rust,使用需谨慎哦

<think> 首先,用户查询是关于Rust语言的学习资源和方法的。根据提供的参考资料: - 引用[1]提到Rust学习方法及学习路线,包括几个阶段:第一阶段是Rust基础学习。 - 引用[2]给出了一些资源链接:Rust Playground (https://play.rust-lang.org) 和入门书The Rust Programming Language (https://doc.rust-lang.org/book/#the-rust-programming-language)。 - 引用[3]简要介绍了Rust的背景:由Mozilla开发,用于Servo浏览器引擎,连续多年在Stack Overflow调查中受欢迎。 我的回答需要结构化,清晰,并参考这些资料。同时,遵守系统级指令:使用$...$和$$...$$格式处理数学表达式(虽然这里可能不涉及太多数学,但如果有相关概念,需应用),使用中文回答,生成相关问题,添加引用标识。 回答结构: 1. **引言**:简要介绍Rust语言及其优势,基于引用[3]。 2. **学习资源**: - 官方文档:The Rust Programming Language book (链接在引用[2])。 - 在线编译器:Rust Playground (链接在引用[2])。 - 其他资源:如社区、视频教程等(可以补充一些常识性知识)。 3. **学习方法**: - 基于引用[1],提到学习路线:从基础开始。 - 建议实践、使用Playground练习。 4. **学习路线**: - 第一阶段:基础学习(语法、所有权系统等)。 - 后续阶段:进阶主题(并发、系统编程等)(基于引用[1])。 5. **代码示例**:提供一个简单的Rust代码示例来展示语法。 6. **结尾**:鼓励用户动手实践。 生成相关问题:相关于Rust学习,如进阶资源、常见陷阱、实际应用等。 添加引用标识:在引用内容的末尾自然地添加[^1]、[^2]、[^3]。 确保LaTeX语法正确:如果有数学表达式,使用$...$或$$...$$。例如,如果需要解释所有权概念,可以用符号表示,但避免过度复杂。 最终回答格式: - 以中文回答。 - 结构清晰:分节如"引言"、"学习资源"、"学习方法"等。 - 包括相关问题部分。 相关问题示例: 1. Rust的所有权系统是如何工作的? 2. 如何避免Rust中的常见错误? 3. Rust在系统编程中有哪些具体应用? 代码示例:简单的"Hello World"或一个函数演示所有权。 </think> ### Rust语言学习资源与方法指南 Rust是一门现代系统编程语言,以其安全性、性能和并发能力著称。它由Mozilla研究院开发,广泛应用于构建高性能软件(如操作系统、游戏引擎和Web服务器)。根据Stack Overflow开发者调查,Rust连续多年被评为“最受喜爱编程语言”\[^3\]。以下是针对您需求的学习资源和方法建议,基于权威资料整理。 --- ### 一、核心学习资源推荐 Rust学习资源丰富,建议从官方文档入手,逐步扩展到实践工具: 1. **官方书籍《The Rust Programming Language》**: - 内容覆盖语法基础、所有权系统、并发编程等核心概念,适合新手系统学习。 - 在线阅读地址:[https://doc.rust-lang.org/book/](https://doc.rust-lang.org/book/)\[^2\]。 2. **在线编译器Rust Playground**: - 无需安装本地环境,直接在浏览器中编写、编译和测试Rust代码。 - 网址:[https://play.rust-lang.org](https://play.rust-lang.org)\[^2\],非常适合快速实验语法概念。 3. **社区驱动的进阶资源**: - **Rustlings练习集**:通过小任务巩固基础知识(GitHub开源)。 - **《Rust in Action》书籍**:聚焦实战项目,如构建命令行工具。 - **Rust官方论坛**([https://users.rust-lang.org](https://users.rust-lang.org)):提供问答支持和案例分享。 这些资源已帮助大量开发者高效入门\[^1\]\[^2\]。 --- ### 二、高效学习方法 基于Rust学习路线图(分阶段进行),强调“先基础后实战”\[^1\]: 1. **第一阶段:基础语法与所有权系统**(1-2周) - 重点:变量绑定、数据类型、所有权(ownership)、借用(borrowing)和生命周期。 - 方法: - 每日阅读《The Rust Programming Language》1-2章,并在Rust Playground编写示例代码。 - 所有权是Rust核心概念(确保内存安全),练习时关注编译错误以理解规则。 - 示例代码:所有权转移演示(在Playground运行): ```rust fn main() { let s1 = String::from("hello"); let s2 = s1; // 所有权从s1转移到s2 // println!("{}", s1); // 此行报错:s1所有权已失效 println!("{}", s2); // 输出:hello } ``` 2. **第二阶段:进阶主题与实践**(2-4周) - 重点:并发编程、错误处理、模块系统。 - 方法: - 完成Rustlings练习集(约100个小任务)。 - 构建小项目,如命令行工具或简单Web服务(使用框架如Actix)。 - 技巧:加入社区讨论,解决常见陷阱(如数据竞争或生命周期错误)\[^3\]。 3. **第三阶段:实战项目与优化**(持续提升) - 重点:系统编程、性能优化、FFI(外部函数接口)。 - 方法:贡献开源项目(如Rust标准库)或学习Rust游戏开发实战》类书籍\[^1\]。 关键原则:**边学边练**——80%时间写代码,20%时间理论学习Rust的编译器错误信息非常详细,善用它能加速学习\[^2\]。 --- ### 三、学习路线图总结 Rust学习可简化为三阶段,逐步深入: 1. **基础阶段**:语法 + 所有权系统。 2. **进阶阶段**:并发 + 错误处理 + 项目实践。 3. **专家阶段**:系统级优化 + 领域应用(如游戏或嵌入式)。 整个过程强调“编译器驱动学习”:Rust的严格检查虽增陡学习曲线,但长期回报高(减少运行时错误)\[^3\]。坚持每日编码,2-3个月可掌握核心技能。 --- ### 示例:快速体验RustRust Playground尝试此代码,理解变量不可变性(immutability): ```rust fn main() { let x = 5; // 不可变变量 // x = 10; // 取消注释将报错 println!("x is {}", x); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值