gpt4 book ai didi

rust - Rust 编译器是否将 String 隐式转换为 &str?

转载 作者:行者123 更新时间:2023-11-29 08:24:39 25 4
gpt4 key购买 nike

我为 &'a str 实现了特征 Foo,但是当我为 std::string 调用方法 test 时::String,有效。我检查了我的代码,我确定我没有实现 String 的特性,Rust 编译器也会将 String 转换为 str含蓄地?

代码是这样的:

pub trait Foo {
fn test(self) -> String;
}

impl<'a> Foo for &'a str {
fn test(self) -> String {
String::from("da")
}
}

fn main() {
let s = String::from("123456789");
println!("{}", s.test());
}

Jetbrains IDE 的 Rust 插件找不到 Stringtest 方法,但它运行良好。

为什么该代码有效?

最佳答案

首先,小心。 字符串 != CString。并且 s.test(var) 不会产生任何错误,因为您的 test 方法只接受 self 参数。

现在,看看实际发生了什么。

当您定义一个扩展方法时,就像定义一个特征然后为 &_ str 而不是 String 实现它,然后尝试调用它一样,编译器隐式执行取消引用(因为 StringDeref 实现为 &_ str)。

因此,为清楚起见,您的 main 函数可以编写为:

fn main() {
let s = String::from("123456789");
println!("{}", (s.deref()).test());
}

并且完全类似于编译器在后台所做的事情。编译器基本上看到您正在尝试使用它,并为您这样做。

不过我需要警告你 - 你的代码在很多方面都非常奇怪:

  • 人们通常在对象上实现像这样的特征方法,而不是它们的 Deref 对应物,正是为了避免这种间接级别
  • 您的实现使用了一个引用。考虑一下。

一种更好、更间接的写法如下:

pub trait Foo {
fn test(&self) -> String;
}

impl Foo for str {
fn test(&self) -> String {
String::from("da")
}
}

fn main() {
let s = String::from("123456789");
println!("{}", s.test());
}

您没有牺牲任何东西,功能保持不变,但是:

  • 您不再不必要地使用引用
  • 您不再不必要地强制编译器推断一个deref 调用

关于rust - Rust 编译器是否将 String 隐式转换为 &str?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53921256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com