Iod*_*Pit 1 generics closures traits rust trait-objects
我不知道如何在结构中存储闭包对象。闭包对象的参数和返回值是已知的。这是我的精简代码:
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", op: |a,b| a },
// Instr { name: "qwer", op: |a,b| a }
// ];
}
Run Code Online (Sandbox Code Playgroud)
坦率地说,我不明白这些错误是什么意思。在我看来,这很简单。封闭件具有类型和已知尺寸。将它存储在相同类型的类型字段中应该很简单。对?
尝试F: ?Sized按照错误消息的提示进行添加并不能修复“编译时大小未知”错误。
有人可以帮我正确编译吗?
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", op: |a,b| a },
// Instr { name: "qwer", op: |a,b| a }
// ];
}
Run Code Online (Sandbox Code Playgroud)
不同的闭包有不同的大小,所以你不能在结构中存储“原始闭包”或“原始特征对象”,它们必须在一个指针后面,所以你可以Box像这样放置它们:
struct Instr {
name: String,
op: Box<dyn Fn([i32; 4], [i32; 3]) -> [i32; 4]>,
}
fn main() {
let instrs = vec![
Instr { name: "asdf".into(), op: Box::new(|a,b| a) },
Instr { name: "qwer".into(), op: Box::new(|a,b| a) }
];
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
349 次 |
| 最近记录: |