关于这个主题已经有很多线程,但我无法看到讨论的问题是否适用于我的特定问题。
我有一个存储 a 的结构name
and a 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
对象。
所以我的问题是:我怎样才能实现我想要的目标以及实现这一目标的最佳方法是什么(以及为什么)?