面试题答案
一键面试- 为什么指定
&str
对借用检查器至关重要:- Rust的借用检查器通过明确的类型信息来确保内存安全。当使用
&str
作为函数参数类型时,借用检查器确切知道它处理的是一个不可变的字符串切片,其生命周期与调用者传入的引用相关。 - 如果使用泛型类型(例如
T
),借用检查器无法得知T
代表什么类型,也就无法判断该类型的借用规则和生命周期。&str
是Rust中字符串切片的标准类型,它有固定的内存布局和已知的生命周期规则,这使得借用检查器能够准确地进行借用分析,避免悬空指针、数据竞争等内存安全问题。
- Rust的借用检查器通过明确的类型信息来确保内存安全。当使用
- 示例:
// 导致借用检查错误的代码 fn print_string<T>(s: T) { println!("{}", s); } fn main() { let my_string = String::from("Hello"); print_string(my_string); }
- 错误原因:在上述代码中,
print_string
函数使用泛型T
,Rust不知道T
的具体类型。当main
函数中传入my_string
(类型为String
)时,println!
宏要求参数实现Display
trait。虽然String
实现了Display
,但由于类型不明确,借用检查器无法确定T
的借用规则。而且在print_string
函数中,s
在函数结束时会被释放(如果T
拥有所有权),这可能导致my_string
在main
函数后续被非法访问。
- 错误原因:在上述代码中,
- 改正方法:
fn print_string(s: &str) { println!("{}", s); } fn main() { let my_string = String::from("Hello"); print_string(&my_string); }
- 说明:在修改后的代码中,
print_string
函数明确指定参数类型为&str
。在main
函数中,通过&my_string
将String
转换为&str
切片传递给函数。这样借用检查器能够清晰地了解借用关系,确保my_string
的生命周期在借用期间有效,从而避免借用检查错误。
- 说明:在修改后的代码中,