Как вернуть любой из функции?

#rust #typing

#Ржавчина #ввод

Вопрос:

Я работаю над системой типов для проекта базы данных. Одна из проблем заключается в сопоставлении идентификатора типа с устройством чтения, которое, учитывая идентификатор типа и адрес, функция может возвращать данные любого типа от встроенных u32 , String , до определенных структур.

У меня нет никаких проблем с авторами, например, с таким макросом

     fn set_val (data: amp;Any, id:i32, mem_ptr: usize) {
         match id {
             $(
                 $id => $io::write(*data.downcast_ref::<$t>().unwrap(), mem_ptr),
             )*
             _ => (),
         }
    }
  

Но для читателя Any кажется неудобным использовать в качестве возвращаемого значения, потому the trait bound "std::any::Any 'static: std::marker::Sized" is not satisfied что . Я также пытался вернуть в качестве ссылки, но я застрял на всю жизнь

     fn get_val (id:i32, mem_ptr: usize) -> Option<amp; Any> {
         match id {
             $(
                 $id => Some(amp;$io::read(mem_ptr)),
             )*
             _ => None,
         }
    }
  

который жалуется missing lifetime specifier . Если 'static здесь не сработает из-за того, что возвращаемое значение недостаточно долго живет, как я могу указать здесь время жизни?

PS. Функция чтения из $io возвращает любые типы.

Ответ №1:

Any это признак, который означает, что он не имеет размера и, следовательно, не может быть возвращен функцией как есть.

Тем не менее, вы можете попробовать заблокировать его:

 fn get_val (id:i32, mem_ptr: usize) -> Option<Box<Any>> {
     match id {
         $(
             $id => Some(Box::new($io::read(mem_ptr))),
         )*
         _ => None,
     }
}
  

Пример Box {
if numbers {
Box::new(&DATA)
} else {
Box::new(String::from(«Heya!»))
}
}

fn main() {
let smth = fun(true);
println!(«{:?}», smth.downcast_ref::());
let smth = fun(false);
println!(«{:?}», smth.downcast_ref::());
}amp;version=stableamp;backtrace=0″>манежа
.