Rust:通过工厂方法创建Struct时出现问题



采用这个最小repo(操场(,在这里我尝试将一个带有闭包的结构作为字段,并定义一些额外的工厂方法,以闭包的形式提供自定义逻辑。

#![allow(non_snake_case)]
struct FunStruct<T>
where
T: Fn(i32) -> i32
{
pub p: T,
}
fn Create<T>() -> FunStruct<T>
where
T: Fn(i32) -> i32
{
let p : T = |val| -> i32 {
return val;
};

let a = FunStruct {
p,
};

return a;
}
fn main() {
let a = Create();

println!("{}", (a.p)(5));
}

上面的代码段引发了以下错误。

error[E0308]: mismatched types
--> src/main.rs:14:17
|
10 |   fn Create<T>() -> FunStruct<T>
|             - this type parameter
...
14 |       let p : T = |val| -> i32 {
|  _____________-___^
| |             |
| |             expected due to this
15 | |         return val;
16 | |     };
| |_____^ expected type parameter `T`, found closure
|
= note: expected type parameter `T`
found closure `[closure@src/main.rs:14:17: 16:6]`
error[E0282]: type annotations needed for `FunStruct<T>`
--> src/main.rs:26:13
|
26 |     let a = Create();
|         -   ^^^^^^ cannot infer type for type parameter `T` declared on the function `Create`
|         |
|         consider giving `a` the explicit type `FunStruct<T>`, where the type parameter `T` is specified
|
= note: type must be known at this point
error: aborting due to 2 previous errors
Some errors have detailed explanations: E0282, E0308.
For more information about an error, try `rustc --explain E0282`.

然而,这似乎很好

struct FunStruct<T>
where
T: Fn(i32) -> i32
{
pub p: T,
}
fn main() {
let p = |val| -> i32 {
return val;
};

let a = FunStruct {
p
};

println!("{}", (a.p)(5));
}

一个抽象层次似乎会毁掉它。

泛型参数意味着它适用于任何类型-然而,Create中的闭包不适用于任何闭包类型,它创建了一个具有特定类型的闭包。你可以这样做:
fn Create() -> FunStruct<impl Fn(i32) -> i32>{
let p/*: some anonymous, unique type */ = |val| -> i32 {
return val;
};

let a = FunStruct {
p,
};

return a;
}

返回位置的CCD_;我返回了一些实现这个特性的类型,不过我不会告诉你它实际上是什么;。相比之下,你原来的功能是说";给定一个函数的任何类型,我都可以返回它"-这显然没有道理。

最新更新