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
调用,这是一种动态大小的类型。操场上的最小示例: