Generics 为什么传递对泛型类型参数的引用需要?大小?

Generics 为什么传递对泛型类型参数的引用需要?大小?,generics,reference,rust,dynamic-sizing,Generics,Reference,Rust,Dynamic Sizing,当我在上运行以下代码时 fn参与第1部分和第1部分{ s、 拆分(“:”).next().unwrap() } fn参加第2部分(s:&a T)->&a str{ 设b=s.as_ref().split(':').next().unwrap(); B } fn main(){ println!(“{}”,第1部分(“a:b”); println!(“{}”,第2部分(“a:b”); } 。。。编译器返回一个没有意义的错误: 12 | println!(“{}”,第二部分(“a:b”); |^^

当我在上运行以下代码时

fn参与第1部分和第1部分{
s、 拆分(“:”).next().unwrap()
}
fn参加第2部分(s:&a T)->&a str{
设b=s.as_ref().split(':').next().unwrap();
B
}
fn main(){
println!(“{}”,第1部分(“a:b”);
println!(“{}”,第2部分(“a:b”);
}
。。。编译器返回一个没有意义的错误:

12 | println!(“{}”,第二部分(“a:b”);
|^^^^^^^^^^^^^在编译时没有已知的大小
|
=help:trait`std::marker::Sized`未为`str实现`
我可以通过添加
?大小
来修复它,如下所示:

fn参加第二部分(s:&a T)->&a str{
为什么需要这个
?大小
(为什么编译器将错误指向函数调用)?它做什么?我是否应该将引用传递给一个未大小的对象并让它正常工作


让我困惑的是,非泛型实现的工作原理与您预期的一样,对
大小的
没有要求(尽管编译器指出str不是
大小的
!)

在大多数使用类型参数的地方,Rust会隐式插入一个额外的
大小的
绑定。这是因为这是最常见的情况-如果它不这样做,那么你就必须自己编写绑定,它会变得重复和嘈杂

例如,您的
take_part
函数与此完全等效:

fn take_part_2<'a, T: 'a + AsRef<str> + Sized>(s: &'a T) -> &'a str {
    let b = s.as_ref().split(':').next().unwrap();
    b
}
fn参加第二部分(s:&a T)->&a str{
设b=s.as_ref().split(':').next().unwrap();
B
}

但是,函数的实现不需要将
T
设置为
size
,因为它只通过引用来使用它。添加
:?size
有效地删除了该隐式绑定,并与类型检查器通信
T
的大小不需要已知,因此函数尽可能通用。在这种情况下,使其更为通用,可以使用
T
作为
str
调用,这是一种动态大小的类型。

操场上的最小示例: