Generics 创建新泛型结构的正确方法是什么?
我正在尝试创建一个可以初始化为Generics 创建新泛型结构的正确方法是什么?,generics,struct,rust,Generics,Struct,Rust,我正在尝试创建一个可以初始化为T类型的通用结构。看起来是这样的: pub struct MyStruct<T> { test_field: Option<T>, name: String, age: i32, } impl MyStruct<T> { fn new(new_age: i32, new_name: String) -> MyStruct<T> { MyStruct<T>
T
类型的通用结构。看起来是这样的:
pub struct MyStruct<T> {
test_field: Option<T>,
name: String,
age: i32,
}
impl MyStruct<T> {
fn new(new_age: i32, new_name: String) -> MyStruct<T> {
MyStruct<T> {
test_field: None,
age: new_age,
name: new_name,
}
}
}
pub-struct-MyStruct{
测试字段:选项,
名称:String,
年龄:32岁,
}
impl MyStruct{
fn new(new_age:i32,new_name:String)->MyStruct{
我的结构{
测试字段:无,
时代:新时代,
名称:新名称,
}
}
}
这似乎不起作用。在其他错误中,我得到:
错误:链式比较运算符需要括号
-->src/lib.rs:9:17
|
9 | MyStruct{
| ^^^^^
|
I强烈推荐阅读。它涵盖了类似这样的基础知识,Rust团队花了大量时间将其做好!具体来说,这可能会有所帮助
实例化结构时不需要使用
。将推断t
的类型。您需要声明t
是impl
块上的泛型类型:
struct MyStruct<T> {
test_field: Option<T>,
name: String,
age: i32,
}
impl<T> MyStruct<T> {
// ^^^
fn new(new_age: i32, new_name: String) -> MyStruct<T> {
MyStruct {
test_field: None,
age: new_age,
name: new_name,
}
}
}
struct MyStruct{
测试字段:选项,
名称:String,
年龄:32岁,
}
impl MyStruct{
// ^^^
fn new(new_age:i32,new_name:String)->MyStruct{
我的结构{
测试字段:无,
时代:新时代,
名称:新名称,
}
}
}
您可以选择使用turbofish语法指定类型参数(:
):
MyStruct::{
// ^^^^^
测试字段:无,
时代:新时代,
名称:新名称,
}
现在,现代编译器版本实际上告诉您:
=help:如果要指定类型参数,请使用“::”而不是“`”
=帮助:如果要指定fn参数,请使用“(…)”
我只在类型不明确的情况下见过类似的情况,这种情况并不经常发生。为什么不在MyStruct中指定创建时的类型?另外,impl和MyStruct之间有什么区别?进一步说:您可以通过使用
MyStruct::
获得所需的内容,但正如Shepmaster所说,您确实需要史蒂夫:因为这对于Rust的类型推断来说是多余的。至于第二个问题:impl
中的
引入了一个类型参数;MyStruct
只是简单地使用它。在这种特定情况下,这一点并不明显,但对于更复杂的impl
块,区别很重要(例如在带有where
子句的traits上)。有时确实需要指定模板。在当前版本的Rust中,如果我无法正确获得生存期,只有在指定模板参数时,我才能得到“引用的生存期超过借用内容的生存期”。如果我不指定(让编译器来推断),我会得到更简洁的结果“由于需求冲突,无法推断出合适的生存期”,它没有像前一个错误那样显示生存期。了解此语法很好,而且,本书没有记录此方面。如果test_字段不是一个选项,而是一个t怎么办?
MyStruct::<T> {
// ^^^^^
test_field: None,
age: new_age,
name: new_name,
}