#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″>манежа.