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

Rust中对String取引用为何会自动转为&str字符串切片?

为什么&String可以自动转为&str传给函数?

这其实是Rust里的**Deref强制转换(Deref coercion)**在帮你自动处理,我结合你的代码给你讲明白:

首先先看你的示例代码:

fn say_hello_slice(slice: &str) {
    println!("Hey {}", slice);
}

fn say_hello_string(string: &String) {
    println!("{:?}", string);
}

fn print_int(int_ref: &i32) {
    println!("{:?}", int_ref);
}

fn main() {
    let slice: &str = "you";
    let s: String = String::from("String");
    say_hello_slice(slice);
    say_hello_slice(&s); // 这里的&String自动转成了&str

    let number: i32 = 12345;
    print_int(&number);

    say_hello_string(&s);
}

运行输出:

Hey you
Hey String
12345
"String"

核心原因:String实现了Deref trait

Rust里的String类型内置实现了Deref<Target=str>,这个trait的作用是告诉编译器:当我们需要&str类型的时候,&String可以被自动解引用并转换为&str。

你可以把这个自动转换理解成编译器帮你做了手动操作:

// 你写的:
say_hello_slice(&s);
// 编译器自动帮你转换成了:
say_hello_slice(&*s);

这里*s是把String解引用成底层的str,然后再取引用得到&str,刚好匹配say_hello_slice的参数类型。

对比i32的例子理解差异

你看print_int函数接受&i32,你传&number(也就是&i32)刚好匹配,这是因为i32并没有实现针对其他类型的Deref,所以不会发生自动转换——这也反过来验证了Deref强制转换是专门针对实现了Deref trait的类型的机制。

这个机制的意义

Deref强制转换是Rust为了提升代码简洁性设计的,它让我们不用在每次需要&str的时候都手动写&*s,同时也保持了类型安全——只有实现了对应Deref的类型才会触发这个转换。

内容的提问来源于stack exchange,提问作者user51

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:08:28