Почти всё заработало. Остался один косяк.
Сейчас есть вот такой код:
pub type Callback<'a> = 'a |~[~str]|: -> ~str;
...
pub fn registr_callback(&mut self, name: ~str, callback: Callback<'a>) {
self.callbacks.insert(name.clone(), callback); // вставка в хеш-таблицу
unsafe {
let callback = self.callbacks.find(&name); // а здесь достаём указатель...
match callback {
Some(cc) => {
name.with_c_str(|s| {
// чтобы вот здесь передать
_ext_createcommand(to_unsafe_ptr(cc),...);
});
}
None => {}
}
}
}
И никак не могу из этого костыля сделать так:
pub fn registr_callback(&mut self, name: ~str, callback: Callback<'a>) {
self.callbacks.insert(name.clone(), callback); // вставка в хеш-таблицу
unsafe {
name.with_c_str(|s| {
// вот здесь передаём ссылку на регистрацию
_ext_createcommand(to_unsafe_ptr(&callback),...);
});
}
}
всё время получаю
note: `callback` moved here because it has type `'a |~[~str]| -> ~str`, which is
a non-copyable stack closure (capture it in a new closure, e.g. `|x| f(x)`, to override)
И будет ли правильным, если я не буду клонировать ~str, а получу &str и вставлю в хеш-таблицу name.into_owned()?