要求类型参数是结构

Mat*_*ner 1 rust

我有一个指定了类型参数的函数,T我假设它是一个结构体。然后我将一个迭代器收集T到一个 Vec. 中:

pub fn get_matches<T>(
    &self,
) -> Vec< T> 
{
    ...
    some_iter.
        .map(|(k, _v)| T{key:(**k).to_string(), hits: 0})
        .collect()
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误

96 |             .map(|(k, _v)| T{key:(**k).to_string(), hits: 0})
   |                            ^ not a struct, variant or union type
Run Code Online (Sandbox Code Playgroud)

我试过让返回类型成为类型参数,但我无法弄清楚如何获取Vec的元素类型并实例化它。我只想生成特定形状的元素(即带有key: string, 和hits: usize)并返回调用者期望的任何容器。

Inl*_*ine 5

Rust 泛型与 C++ 模板不同。它们之所以不同是有正当理由的,例如更好的错误报告和更快的编译。

在 C++ 中,在初始调用阶段不会检查模板(如果我们过度简化)类型,而是模板继续扩展直到它成功,或者运行到该特定类型不支持的操作。

在 Rust 中,会立即检查类型。规范必须预先给出,这意味着在调用站点捕获任何错误,而不是在模板扩展的深处。

您的具体示例假设每个都T应该有字段keyand hits,但T可以是从原始类型到没有keyorhits字段的非公共结构的任何内容。

Rust 的做事方式是声明一个 trait 并使用它来指定该类型具有特定的构造函数。在这种情况下,由于静态多态性,特征将是一个零成本的抽象。

trait StringConstructable {
    fn new(string: String) -> Self;
}

struct Test {
    key: String,
    hits: usize
}

impl StringConstructable for Test {
    fn new(string: String) -> Self {
        Test {
            key: string,
            hits: 0
        }
    }
}

fn test<T: StringConstructable>() -> T {
    T::new("test".to_string())
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接

或者From<String>为您的T.

struct Test {
    key: String,
    hits: usize
}

impl From<String> for Test {
    fn from(string: String) -> Test {
        Test {
            key: string,
            hits: 0
        }
    }
}

fn test<T: From<String>>() -> T {
    T::from("test".to_string())
}
Run Code Online (Sandbox Code Playgroud)

游乐场链接