我有一个指定了类型参数的函数,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)并返回调用者期望的任何容器。
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)
| 归档时间: |
|
| 查看次数: |
160 次 |
| 最近记录: |