Здесь есть допустимое время жизни:
static mut outer: Outer<'static, Context> = unsafe {
^^^^^^^
Поскольку это переменная stati c, компилятор выведет время жизни 'static
, поэтому полный тип outer
равен * 1006. *.
Следовательно, при вызове use_context
тип параметра context
равен &mut Context<'static>
. Однако use_outer_with_context
передает &mut Context<'a>
('a
исключается из источника).
Проблема здесь в том, что T
необходимо указать заранее, тогда как на самом деле T
может меняться от вызова к вызову из-за времени жизни в Context<'a>
.
Ваш образец можно заставить работать, переместив T
из структуры в метод use_context
.
struct Outer<'a> {
buffer: &'a mut [u8],
used: u8,
}
impl<'a> Outer<'a>
{
fn use_context<T>(&mut self, context: &mut T)
where
T: Doable,
{
self.used = context.do_thing();
}
}
fn use_outer_with_context(context: &mut Context) {
static mut buffer: [u8; 64] = [0u8; 64];
static mut outer: Outer<'static> = unsafe {
Outer {
buffer: &mut buffer,
used: 0,
}
};
unsafe {
outer.use_context(context);
}
}
Примечание: я изменил &'a mut self
на &mut self
на Outer::use_context
; 'a
не требуется и может привести к ошибкам компилятора.
Может быть причина, по которой вы не захотите переходить T
к отдельному методу. В таком случае, тогда я не знаю жизнеспособного решения. Если бы Rust имел generi c связанных типов , тогда можно было бы представить Context
с приложением, ожидающим параметр времени жизни. К сожалению, родовые c связанные типы не реализованы с Rust 1.41.0.