2016-07-16 21 views
3

我正在更新一些使用智能指針和其他內存管理代碼的舊Rust代碼,這些代碼在版本1發佈之前已被棄用和刪除。什麼是Rust 1.0之前存在的智能指針的替代品?

有沒有直接替換舊的智能指針之類的東西還是使用Box之類的東西來分配內存更好?

我有這樣的代碼(這是非常簡單!)

struct my_rectangle { 
    x: i32, 
    y: i32, 
    length: i32, 
    breadth: i32, 
} 

fn allocate_rect() { 
    let x: ~my_rectangle = ~my_rectangle{x: 5, y: 5, length: 25, breadth:15}; 
} 

fn firstMethod() { 
    let memblock: @int = @256; 
    secondMethod(memblock); 
    println!(「%d」, *memblock); 
} 

fn secondMethod(memblock: @int) { 
    let secMemblock: @int = memblock; 
} 

這工作之前1.0罰款,但現在無法建立。

回答

1

您可以用Box<T>~[T]替換~TVec<T>@T智能指示燈可由Rc<T>@[T]Rc<RefCell<Vec<T>>>代替。小心不要創建與Rc<T>週期,沒有循環收集器了。如果你希望更新的代碼看起來像你的例子中的代碼,那麼我會建議不要使用指針。 ~T(或Box<T>)特別容易被過度使用,並且通常可以用簡單的T來代替。

4

~T改爲Box<T>~expr現在應該是Box::new(expr)

@T被刪除;它本意是一個指向垃圾收集對象的指針,但事實並非如此。標準庫提供參考計數指針Rc<T>Arc<T>,它應該覆蓋大多數用例。

Rust已經改變了很多,直到1.0。您可能需要閱讀The Rust Programming Language以瞭解自己的最新情況。

1

其他的答案覆蓋的原則,所以這裏是你的具體實例更新時間:

struct MyRectangle { 
    x: i32, 
    y: i32, 
    length: i32, 
    breadth: i32, 
} 

fn allocate_rect() { 
    Box::new(MyRectangle { 
     x: 5, 
     y: 5, 
     length: 25, 
     breadth: 15, 
    }); 
} 
use std::rc::Rc; 

fn first_method() { 
    let memblock = Rc::new(256); 
    second_method(memblock.clone()); 
    println!("{}", memblock); 
} 

fn second_method(memblock: Rc<isize>) { 
    let sec_memblock = memblock; 
} 
  1. intuint分別變爲isizeusize。但是,您不應該盲目地轉換這些 - 通常情況下,特定大小的整數更好。
  2. 類型和性狀使用CamelCase而功能使用snake_case
  3. 不需要多種類型的註釋;類型推斷非常好。
  4. println!不再使用printf樣式的格式字符串。相反,有{}{:?}等佔位符,對應的性狀如DisplayDebug
  5. 沒有必要取消傳遞給println!的參數。
  6. 調用second_method會轉移參數的所有權,然後您無法打印它。您需要撥打clone來增加引用計數並將克隆值傳遞給函數。

我接下來的建議是評估您是否真的需要將這些值中的很多值加框。在某些情況下,您可能能夠接受參考或執行價值的副本(應該便宜)。