【发布时间】:2019-08-05 20:20:30
【问题描述】:
当我在 Rust 操场上运行以下代码时...
fn take_part_1<'a>(s: &'a str) -> &'a str {
s.split(':').next().unwrap()
}
fn take_part_2<'a, T: 'a + AsRef<str>>(s: &'a T) -> &'a str {
let b = s.as_ref().split(':').next().unwrap();
b
}
fn main() {
println!("{}", take_part_1("a:b"));
println!("{}", take_part_2("a:b"));
}
...编译器返回一个没有意义的错误:
12 | println!("{}", take_part_2("a:b"));
| ^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `std::marker::Sized` is not implemented for `str`
我可以通过添加?Sized 来修复它,如下所示:
fn take_part_2<'a, T: 'a + AsRef<str> + ?Sized>(s: &'a T) -> &'a str {
为什么需要这个?Sized(以及为什么编译器将错误指向函数调用)?它有什么作用?我不应该能够将引用传递给未调整大小的对象并让它正常工作吗?
让我感到困惑的是,非泛型实现按您的预期工作,对 ?Sized 没有要求(即使编译器指出 str 不是 Sized!)
【问题讨论】:
-
操场上的最小示例:Link
标签: generics reference rust dynamic-sizing