创建新通用结构的正确方法是什么?

时间:2015-05-22 14:56:40

标签: 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> {
            test_field: None,
            age: new_age,
            name: new_name,
        }
    }
}

这似乎不起作用。在其他错误中,我得到:

error: chained comparison operators require parentheses
 --> src/lib.rs:9:17
  |
9 |         MyStruct<T> {
  |                 ^^^^^
  |

1 个答案:

答案 0 :(得分:10)

强烈推荐阅读The Rust Programming Language。它涵盖了这样的基础知识,Rust团队花了很多时间来做好事!具体来说,section on generics可能在这里有所帮助。

在实例化结构时,您不需要使用<T>。将推断出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,
        }
    }
}

作为DK. points out,您可以选择使用 turbofish 语法(::<>)指定类型参数:

MyStruct::<T> {
//      ^^^^^
    test_field: None,
    age: new_age,
    name: new_name,
}

现代编译器版本现在实际告诉你:

  = help: use `::<...>` instead of `<...>` if you meant to specify type arguments
  = help: or use `(...)` if you meant to specify fn arguments

当类型不明确时,我只见过类似的东西,这种情况并不经常发生。