背景
我知道在Rust中人们更喜欢使用&str
而不是&String
。但是在某些情况下,我们只能使用&String
。
一个例子是当您调用std::iter::Iterator::peekable
时。返回值是一个将原始迭代器包装起来并给您提供一个额外的方法peek
的Peekable<I>
对象。
这里的重点是peek
仅向您提供迭代器项的引用。因此,如果您有一个包含String
的迭代器,在这种情况下您只有&String
。当然,您可以轻松地使用as_str
获取&str
,但在下面我将显示的代码中,这等效于调用clone
。
问题
这段代码
#[derive(Debug)]
struct MyStruct(String);
impl MyStruct {
fn new<T>(t: T) -> MyStruct
where
T: Into<String>,
{
MyStruct(t.into())
}
}
fn main() {
let s: String = "Hello world!".into();
let st: MyStruct = MyStruct::new(&s);
println!("{:?}", st);
}
代码无法编译,因为String
没有实现From<&String>
。这并不直观。
为什么会出现这种情况?这只是标准库缺少的功能吗?还是有其他原因阻止了标准库的实现?
在实际代码中,我只有一个对String
的引用,并且知道只需要调用clone
才能使其正常工作,但我想知道原因。
Vec<T>
不会impl From<&Vec<T>>
;而且impl<'a> From<&'a str>
更有可能被使用,并且它已经准备就绪。 - ljedrz