У меня есть сторонние библиотеки с кодом вроде этого:Как реализовать FnMut, который возвращает ссылку с параметром lifetime?
pub struct Foo<T> { t: T }
impl<'a, T> Foo<T> where T: 'a + FnMut() -> &'a [u8] {
pub fn from_callback(closure: T) -> Self {
Foo { t: closure }
}
}
Он прекрасно работает с закрытием:
let buffer = vec![0; 100];
Foo::from_callback(move || &buffer)
однако я хочу, чтобы вернуться Foo
из моей функции. Из-за этого я не могу использовать закрытие, поэтому я решил использовать собственную структуру, которая реализует FnMut
.
Я определил структура:
pub struct Func {
buffer: Vec<u8>,
}
затем реализован FnMut
для него:
#![feature(unboxed_closures)]
impl FnMut<()> for Func {
extern "rust-call" fn call_mut(&mut self, _:()) -> Self::Output {
&self.buffer
}
}
реализации FnOnce
затем требуется:
impl FnOnce<()> for Func {
type Output = &[u8];
^~~~ error: missing lifetime specifier [E0106]
extern "rust-call" fn call_once(self, _:()) -> Self::Output {
unimplemented!();
}
}
Но я не знаю, что используйте как время жизни для справки в Output
.
Буду рад, если кто-то мне противоречит, однако я боюсь, что это то, что потребует HKT (более высокие категории). –