2015-10-10 10 views
5

Ho una struttura, che a volte istanzio staticamente, ea volte vorrei che gli utenti allocassero sull'heap. È possibile consentire entrambi come argomenti per una funzione?Consentire sia variabili statiche che caselle come argomento di funzione?

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); 
} 

risposta

9

In entrambi i casi, è possibile passare un puntatore alla funzione.

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); 
} 

Si noti che in entrambi i casi, il chiamante deve utilizzare l'operatore & di prendere l'indirizzo del valore. Nella prima chiamata, l'operatore produce uno &Box<MyData>, ma il compilatore lo converte automaticamente in un &MyData perché lo Box implementa lo Deref trait.

+2

Probabilmente è meglio dire "riferimento" anziché "puntatore". Quest'ultimo mi fa pensare a un * pointer crudo * '* const T'. – Shepmaster

Problemi correlati