面试题答案
一键面试- 字符串切片
&str
- 场景:在处理文本时,经常会用到
&str
。例如,函数接收一个字符串作为参数,用于解析、查找子串等操作。比如:
fn find_substring(haystack: &str, needle: &str) -> Option<usize> { haystack.find(needle) }
- 原因:
&str
是动态大小类型,它的长度在编译时是未知的。这使得它非常灵活,可以适应不同长度的字符串。如果使用固定大小的字符串类型(如[u8; N]
),则需要在编译时确定字符串长度,无法处理长度不确定的文本,而&str
可以在运行时根据实际字符串长度来动态调整。
- 场景:在处理文本时,经常会用到
- 特征对象
- 场景:在实现多态行为时使用。比如有一个图形绘制的程序,定义一个
Shape
特征,然后有Circle
和Rectangle
结构体都实现这个特征。可以通过特征对象来统一处理不同形状的绘制。
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
是动态大小类型),可以在运行时根据实际对象的类型来调用相应的方法,实现多态。如果不使用动态大小类型,就很难在编译时确定统一处理不同形状对象的方式,因为每个形状结构体的大小可能不同。
- 场景:在实现多态行为时使用。比如有一个图形绘制的程序,定义一个