在Rust 1.0之前存在哪些智能指针的替代品?

时间:2016-07-16 10:34:42

标签: rust

我正在更新一些使用智能指针和其他内存管理代码的旧Rust代码,这些代码在版本1发布之前已被弃用和删除。

是否可以直接替换旧智能指针,或者使用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之前工作正常,但现在无法构建。

3 个答案:

答案 0 :(得分:4)

~T已更改为Box<T>~expr现在应为Box::new(expr)

@T已被删除;它本来是指向垃圾收集对象的指针,但事实并非如此。标准库提供了引用计数指针Rc<T>Arc<T>,它应涵盖大多数用例。

Rust已经改变了很多,直到1.0。您可能需要阅读The Rust Programming Language以了解最新动态。

答案 1 :(得分:1)

您可以~T替换Box<T>~[T]替换Vec<T>@T智能指针可以由Rc<T>替换,@[T]可以替换为Rc<RefCell<Vec<T>>>。注意不要用Rc<T>创建循环,不再有循环收集器。如果您希望更新的代码看起来与示例中的代码类似,那么我建议您根本不使用指针。 ~T(或Box<T>)特别容易被滥用,通常可以用简单的T替换。

答案 2 :(得分: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来增加引用计数并将克隆值传递给函数。
  7. 我的建议是评估你是否真的需要包装许多这些值。在某些情况下,您可以接受引用或执行该值的副本(应该很便宜)。