问题描述
我不知道如何在结构中存储闭包对象。闭包对象的参数和返回值是已知的。这是我的精简代码:
struct Instr<F>
where F: Fn([i32;4],[i32;3]) -> [i32;4]
{
name: String,op: F
}
fn main()
{
// Simple example showing the difficulty:
let tmp : Instr<Fn([i32;4],[i32;3]) -> [i32;4]> = Instr { name: "asd".to_string(),op: |a,b| a};
// What I really want is something more like this:
// let instrs = vec![
// Instr { name: "asdf",b| a },// Instr { name: "qwer",b| a }
// ];
}
坦率地说,我不明白这些错误是什么意思。在我看来,这很简单。封闭件具有类型和已知尺寸。将它存储在相同类型的类型字段中应该很简单。对吗?
按照错误消息的提示尝试添加 F: ?Sized
并不能解决“编译时大小未知”错误。
有人能帮我正确编译吗?
error[E0277]: the size for values of type `dyn Fn([i32; 4],[i32; 3]) -> [i32; 4]` cannot be known at compilation time
--> a.rs:11:15
|
1 | struct Instr<F>
| - required by this bound in `Instr`
...
11 | let tmp : Instr<Fn([i32;4],b| a};
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `dyn Fn([i32; 4],[i32; 3]) -> [i32; 4]`
help: you could relax the implicit `Sized` bound on `F` if it were used through indirection like `&F` or `Box<F>`
--> a.rs:1:14
|
1 | struct Instr<F>
| ^ this could be changed to `F: ?Sized`...
2 | where F : Fn([i32;4],[i32;3]) -> [i32;4]
| - ...if indirection was used here: `Box<F>`
...
5 | op : F
| - ...if indirection was used here: `Box<F>`
error[E0277]: the size for values of type `dyn Fn([i32; 4],[i32; 3]) -> [i32; 4]` cannot be known at compilation time
--> a.rs:11:55
|
1 | / struct Instr<F>
2 | | where F : Fn([i32;4],[i32;3]) -> [i32;4]
3 | | {
4 | | name : String,5 | | op : F
6 | | }
| |_- required by `Instr`
...
11 | let tmp : Instr<Fn([i32;4],b| a};
| ^^^^^ doesn't have a size known at compile-time
|
= help: the trait `Sized` is not implemented for `dyn Fn([i32; 4],[i32; 3]) -> [i32; 4]`
error[E0308]: mismatched types
--> a.rs:11:92
|
11 | let tmp : Instr<Fn([i32;4],b| a};
| ^^^^^^^ expected trait object `dyn Fn`,found closure
|
= note: expected trait object `dyn Fn([i32; 4],[i32; 3]) -> [i32; 4]`
found closure `[[email protected]:11:92: 11:99]`
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)