2015-10-10 16 views
5

Mam struct, który czasami stawiam statycznie, a czasami chciałbym, aby użytkownicy alokowali na stercie. Czy możliwe jest dopuszczenie obu jako argumentów do funkcji?Umożliwienie zarówno zmiennych statycznych, jak i pól jako argument funkcji?

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

Odpowiedz

9

W obu przypadkach można przekazać wskaźnik do funkcji.

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

Należy zauważyć, że w obu przypadkach dzwoniący musi użyć operatora & wziąć adres wartości. W pierwszym wywołaniu operator podaje &Box<MyData>, ale kompilator automatycznie konwertuje go na &MyData, ponieważ Box implementuje Deref trait.

+2

Prawdopodobnie lepiej jest powiedzieć "odniesienie" zamiast "wskaźnik". Ten ostatni sprawia, że ​​myślę o * surowym wskaźniku * '* const T'. – Shepmaster

Powiązane problemy