什么是这个C结构的Rust等价物?

时间:2015-01-19 14:04:40

标签: rust

我正在浏览Rust书,并且是在所有权章节。他们有一个汽车样品和四个轮子。车轮知道车主(车),但车子不知道车轮。这让我想到,这个C代码的Rust等价物是什么?

struct Car;
struct Wheel {
    int size;
    struct Car *owner;
};

struct Car {
    char const *name;
    Wheel wheels[4];
};

1 个答案:

答案 0 :(得分:3)

嗯,字面上的答案是:

struct Car {
    name: &'static str, // '
    wheels: [Wheel; 4],
}

struct Wheel {
    size: i32,
    owner: *mut Car,
}

但由于owner无法在unsafe代码之外使用,因此它不是非常有用,因为它是一个裸指针。然而,这受到Rust的限制,因为在实践中不可能有循环借用的参考;也就是说,您无法使用&Car owner

这引出了一个问题:你真正想要表达的是什么,在这里? Wheel 实际是否需要了解其附加的Car?如果没有,你可以放弃owner,一切都会好起来。

如果确实如此,您是否可以使用unsafe块来代替您的代码(除此之外:这通常是您最后的选择)?如果没有,您需要一些共享所有权的概念。在这种情况下,您是否只需要对此结构的只读访问权限?如果是这样,也许你想要Rc<Car>。如果没有,您可能需要Rc<Cell<Car>> ...除非您在线程环境中工作,在这种情况下您需要Arc<Mutex<Car>> ...也许。

我想我所得到的是:明显,直接等效,但如果你真的试图移植语义......你和#39;需要更具体地了解您尝试做的事情,而不是 您尝试做的事情。