You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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跨类型实现

  1. Deref自动解引用
    Rust的String类型实现了Deref trait,当代码中出现&String时,编译器会自动将其解引用为&str(字符串切片)。也就是说&s会被隐式转换成&*s,此时两边的类型统一为&str,自然可以直接比较内容。

  2. PartialEq的跨类型支持
    就算没有Deref强制转换,标准库也为String和str实现了双向的PartialEq trait:

  • impl PartialEq<str> for String
  • impl 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 18:27:06