2016-10-11 10 views
1

私はデータベースプロジェクトのタイプシステムに取り組んでいます。 1つの問題は、型IDと型を指定した読者に型IDをマップすることです。関数は、指定された構造体に、Stringという組み込みの任意のデータ型を返すことができます。関数からすべてを返す方法は?

私は、このようなマクロ

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ので、戻り値として使用されるように慣れていないようだしないでください。私はまた、リファレンスとして返すようにしようとしたが、私はmissing lifetime specifierを文句寿命

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

で立ち往生しています。戻り値が長すぎないために'staticがここで動作しない場合は、ここで寿命をどのように指定できますか?

PS。 $ ioのread関数は、あらゆる種類の型を返します。

答えて

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

関連する問題