这个话题已经有很多讨论了,但我不确定之前讨论的问题是否适用于我的问题。
我有一个结构体,里面存储着一个name
和一个 callback
函数。简化后的代码如下:
pub struct Command<'a> {
name: &'a str,
callback: &'a Fn(&[&str]) -> ()
}
impl <'a> Command<'a> {
pub fn new(name: &'a str, callback: &'a Fn(&[&str]) -> ()) -> Command<'a> {
Command {
name: name,
callback: callback
}
}
}
我想要做的是将回调函数与名称(和可能有的其他内容)关联存储。
但是当我尝试像这样使用以下代码时:
fn main() {
let play_callback = |args| {
println!("Playing something.");
for arg in args {
println!("{}", arg);
}
};
let play_command = Command::new("play", &play_callback);
}
我收到了以下错误信息:
src/main.rs:22:42: 22:56 error: type mismatch resolving `for<'r, 'r> <[closure@src/main.rs:16:22: 21:3] as std::ops::FnOnce<(&'r [&'r str],)>>::Output == ()`:
expected bound lifetime parameter ,
found concrete lifetime [E0271]
src/main.rs:22 let play_command = Command::new("play", &play_callback);
^~~~~~~~~~~~~~
我试图像这样内联闭包
fn main() {
let play_command = Command::new("play", &|args| {
println!("Playing something.");
for arg in args {
println!("{}", arg);
}
});
}
但是我又遇到了另一个错误
src/main.rs:16:47: 21:7 error: borrowed value does not live long enough
我相信我理解为什么我得到它。
在切换到首先存储在我的
Command
结构中的函数引用之前,我尝试为Command
使用通用类型参数,但当我想要像这样初始化命令对象的HashSet
时:let mut commands: HashSet<Command> = HashSet::new();
编译器要求我指定泛型参数,但我认为这是不可能的,因为这意味着我只能在所有
Command
对象中存储相同的闭包。所以我的问题是:我该如何实现我想要的功能,最好的方法是什么(为什么),请指导。