2016-10-11 4 views
1

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

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

fn set_val (data: &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<& Any> { 
     match id { 
      $(
       $id => Some(&$io::read(mem_ptr)), 
      )* 
      _ => None, 
     } 
    } 

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

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

ответ

7

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

Однако вы можете попробовать бокс это:

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

Пример playpen.

 Смежные вопросы

  • Нет связанных вопросов^_^