Rust 学习笔记:关于枚举与模式匹配的练习题

Rust 学习笔记:关于枚举与模式匹配的练习题

参考视频:

  1. https://www.bilibili.com/video/BV1YNmZYkE8D

以下程序能否通过编译?若能,输出是什么?

fn foo(x: &i32) {
    println!("{x}")
}

fn main() {
    let x = null;
    foo(x);
}

不能编译。

error[E0425]: cannot find value `null` in this scope

考虑这两种表示结果类型的方式,若计算成功,则包含值 T;若计算失败,则包含错误 E。在 Rust 中,枚举 Result2 被认为比结构体 Result1 更符合习惯。下面哪个说法不是一个合理的原因?

struct Result1<T, E> {
    ok: Option<T>,
    err: Option<E>,
}

enum Result2<T, E> {
    Ok(T),
    Err(E),
}

A. 结构体在运行时占用的内存比枚举更多
B. 结构体的构造语法比枚举更冗长
C. 结构体包含的 Option 类型,仅用于包装结构体
D. 结构体的 ok 和 err 都可以为 None,而枚举至少有一个不为 None

答:C。

以下程序能否通过编译?若能,输出是什么?

enum Location {
    Point(i32),
    Range(i32, i32),
}

fn main() {
    let l: Location = Location::Range(0, 5);
    let n = match l {
        Location::Point(_) => -1,
        Location::Range(_, n) => n,
        Location::Range(0, _) => 0,
        _ => -2,
    };
    println!("{n}");
}

虽然 match 中的最后两个模式不可能比较得到,但程序可以通过编译。

程序匹配第二个模式,输出 5。

以下哪个选项最能描述这个函数?

impl<T> Option<T> {
    fn unwrap_or(&self, other: T) -> T {
        match self {
            Some(t) => t,
            None => other,
        }
    }
}

A. 返回 self 内部的对象(如果存在),否则返回 other
B. 返回一个包含 self 内部对象的新 option(如果存在),否则返回 other
C. 如果 self 尚未包含值,则插入 other
D. 返回对 self 内部对象的引用(如果存在),否则返回 other

答:A。

以下程序能否通过编译?若能,输出是什么?

#[derive(Debug)]
enum Either {
    Left(usize),
    Right(String),
}

fn main() {
    let x = Either::Right(String::from("Hello world"));
    let value = match x {
        Either::Left(n) => n,
        Either::Right(s) => s.len(),
    };
    println!("{x:?} {value}");
}

不能编译。枚举 x 被部分移动,不能再读取。

两个函数在以下哪种情况下具有相同的行为?

fn decr_twice_v1(n: u32) -> Option<u32> {
    match n {
        0 => None,
        1 => None,
        n2 => Some(n2 - 2),
    }
}

fn decr_twice_v2(n: u32) -> Option<u32> {
    if n == 0 {
        None
    } else if n == 1 {
        None
    } else {
        Some(n - 2)
    }
}

A. 对一些输入有效,但不是所有输入
B. 对所有输入有效
C. 对任何输入无效

答:B。

以下函数中使用哪种控制流结构最符合惯用法?

enum Location {
    Point(i32),
    Range(i32, i32),
}

fn print_range_max(loc: &Location) {
    // print the second field of Range, if loc is a Range
}

答:if let。

以下函数中使用哪种控制流结构最符合惯用法?

enum Location {
    Point(i32),
    Range(i32, i32),
}

fn get_start(loc: &Location) {
    // return the first field of Range or the only field of Point
}

答:match。

基于Swin TransformerASPP模块的图像分类系统设计实现 本文介绍了一种结合Swin Transformer空洞空间金字塔池化(ASPP)模块的高效图像分类系统。该系统通过融合Transformer的全局建模能力和ASPP的多尺度特征提取优势,显著提升了模型在复杂场景下的分类性能。 模型架构创新 系统核心采用Swin Transformer作为骨干网络,其层次化窗口注意力机制能高效捕获长距离依赖关系。在特征提取阶段,创新性地引入ASPP模块,通过并行空洞卷积(膨胀率6/12/18)和全局平均池化分支,实现多尺度上下文信息融合。ASPP输出经1x1卷积降维后原始特征拼接,有效增强了模型对物体尺寸变化的鲁棒性。 训练优化策略 训练流程采用Adam优化器(学习率0.0001)和交叉熵损失函数,支持多GPU并行训练。系统实现了完整的评估指标体系,包括准确率、精确率、召回率、特异度和F1分数等6项指标,并通过动态曲线可视化模块实时监控训练过程。采用早停机制保存最佳模型,验证集准确率提升可达3.2%。 工程实现亮点 1. 模块化设计:分离数据加载、模型构建和训练流程,支持快速迭代 2. 自动化评估:每轮训练自动生成指标报告和可视化曲线 3. 设备自适应:智能检测CUDA可用性,无缝切换训练设备 4. 中文支持:优化可视化界面的中文显示负号渲染 实验表明,该系统在224×224分辨率图像分类任务中,仅需2个epoch即可达到92%以上的验证准确率。ASPP模块的引入使小目标识别准确率提升15%,特别适用于医疗影像等需要细粒度分类的场景。未来可通过轻量化改造进一步优化推理速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值