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,
}