2015-10-10 14 views
5

私は時々静的にインスタンス化する構造体を持っていますが、時にはユーザーがヒープに割り当てることを望みます。関数への引数として両方を許可することは可能ですか?静的変数とボックスの両方を関数の引数として使用できますか?

pub struct MyData { 
    x: i32 
} 

static ALLOCATED_STATICALLY: MyData = MyData {x: 1}; 

// what should my signature be? 
fn use_data(instance: Box<MyData>) { 
    println!("{}", instance.x); 
} 

fn main() { 
    use_data(Box::new(MyData{x: 2})); 
    // this doesn't work currently 
    use_data(ALLOCATED_STATICALLY); 
} 

答えて

9

どちらの場合でも、関数へのポインタを渡すことができます。

pub struct MyData { 
    x: i32 
} 

static ALLOCATED_STATICALLY: MyData = MyData { x: 1 }; 

// what should my signature be? 
fn use_data(instance: &MyData) { 
    println!("{}", instance.x); 
} 

fn main() { 
    use_data(&Box::new(MyData{ x: 2 })); 
    use_data(&ALLOCATED_STATICALLY); 
} 

両方のケースでは、呼び出し側が値のアドレスを取るために&演算子を使用する必要があることに注意してください。最初の呼び出しでは、演算子は&Box<MyData>になりますが、BoxDeref traitを実装しているため、コンパイラは自動的に&MyDataに変換します。

+2

"ポインタ"ではなく "参照"と言う方がいいでしょう。後者は私に*生ポインタ* 'const T'を考えるようになります。 – Shepmaster

関連する問題