MST

星途 面试题库

面试题:Rust 中动态大小类型(DST)的常见应用场景有哪些

请举例说明在 Rust 编程中,动态大小类型(DST)一般会在哪些场景下使用,并且简单阐述为什么这些场景适合使用 DST。
25.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 字符串切片 &str
    • 场景:在处理文本时,经常会用到 &str。例如,函数接收一个字符串作为参数,用于解析、查找子串等操作。比如:
    fn find_substring(haystack: &str, needle: &str) -> Option<usize> {
        haystack.find(needle)
    }
    
    • 原因&str 是动态大小类型,它的长度在编译时是未知的。这使得它非常灵活,可以适应不同长度的字符串。如果使用固定大小的字符串类型(如 [u8; N]),则需要在编译时确定字符串长度,无法处理长度不确定的文本,而 &str 可以在运行时根据实际字符串长度来动态调整。
  2. 特征对象
    • 场景:在实现多态行为时使用。比如有一个图形绘制的程序,定义一个 Shape 特征,然后有 CircleRectangle 结构体都实现这个特征。可以通过特征对象来统一处理不同形状的绘制。
    trait Shape {
        fn draw(&self);
    }
    
    struct Circle {
        radius: f64,
    }
    
    struct Rectangle {
        width: f64,
        height: f64,
    }
    
    impl Shape for Circle {
        fn draw(&self) {
            println!("Drawing a circle with radius {}", self.radius);
        }
    }
    
    impl Shape for Rectangle {
        fn draw(&self) {
            println!("Drawing a rectangle with width {} and height {}", self.width, self.height);
        }
    }
    
    fn draw_shapes(shapes: &[Box<dyn Shape>]) {
        for shape in shapes {
            shape.draw();
        }
    }
    
    • 原因:不同的结构体实现 Shape 特征时,它们的大小可能不同。通过使用特征对象 Box<dyn Shape>(这里 dyn Shape 是动态大小类型),可以在运行时根据实际对象的类型来调用相应的方法,实现多态。如果不使用动态大小类型,就很难在编译时确定统一处理不同形状对象的方式,因为每个形状结构体的大小可能不同。