为何Rust允许&String与字符串切片进行比较?
fn main() { println!("hello hello"); let s = String::from("something"); assert_eq!(&s, "something"); println!("able to compare &String with a string slice"); }
运行输出:
Finished dev [unoptimized + debuginfo] target(s) in 0.03s Running `target/debug/SomePrototype` hello hello able to compare &String with a string slice
为什么&String能和字符串切片直接比较?
核心原因:Deref强制转换 + PartialEq跨类型实现
Deref自动解引用
Rust的String类型实现了Dereftrait,当代码中出现&String时,编译器会自动将其解引用为&str(字符串切片)。也就是说&s会被隐式转换成&*s,此时两边的类型统一为&str,自然可以直接比较内容。PartialEq的跨类型支持
就算没有Deref强制转换,标准库也为String和str实现了双向的PartialEqtrait:
impl PartialEq<str> for Stringimpl PartialEq<String> for str
同时Rust会自动为引用类型&T和&U生成PartialEq实现(只要T和U之间实现了PartialEq)。所以&String和字符串字面量(本质是&'static str)之间的比较,会直接匹配对应的跨类型PartialEq逻辑,对比两者的底层字符序列。
具体执行流程
当运行assert_eq!(&s, "something")时:
- 右侧的
"something"是&'static str类型 - 左侧的
&s是&String类型 - 编译器要么通过Deref强制转换把
&String转成&str,让两边类型一致后用str的比较逻辑;要么直接调用&String与&str的跨类型PartialEq实现,最终都是对比两者的字符内容是否完全一致。
这两种机制共同让这种简洁的跨类型比较成为可能,无需开发者手动做类型转换。
内容的提问来源于stack exchange,提问作者py_ios_dev
相关产品推荐
相关产品推荐

