2015-01-19 3 views
1

Я прохожу через книгу ржавчины и нахожусь в разделе владения. У них есть образец автомобиля и четыре колеса. Колеса знают своего владельца (машину), но автомобиль не знает своих колес. Это заставило меня задуматься, что такое эквивалент Rust этого кода на C?Что такое эквивалент Rust этой структуры C?

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

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

ответ

3

Ну, дословный ответ был бы:

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

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

Но это не очень полезным, поскольку owner не могут быть использованы за пределами unsafe кода, так как это голый указатель. Это, однако, приводит к ограничению ржавчины в том, что на практике невозможно иметь циклические заимствованные ссылки; то есть вы не можете использовать &Car для owner.

Который задает вопрос: что это такое, что вы действительно хотите выразить, здесь? Действительно ли Wheelдействительно необходимо знать о Car к нему прилагается? Если нет, вы можете просто отказаться от owner, и все будет хорошо.

Если да, можете ли вы жить с unsafe блоками, наносимыми на ваш код (в стороне: это, как правило, будет вашим последним средством)? Если нет, вам нужно понятие об общей собственности. В этом случае требуется ли доступ к этой структуре только для чтения? Если это так, возможно, вы хотите Rc<Car>. Если нет, вам может понадобиться Rc<Cell<Car>> ... если вы не работаете в потоковой среде, и в этом случае вам понадобится Arc<Mutex<Car>> ... может быть.

Я полагаю, что я получаю: есть очевидный, прямой эквивалент, но если вы на самом деле пытаетесь перенести семантику ... вам нужно будет более конкретно о том, что вы 'пытаюсь сделать, а не как вы пытаетесь это сделать.

+0

Все это хорошая информация. В общем, в Rust и C я бы не писал такой код, хотя иногда это случается. Мне было просто интересно, как выражать отношения Владелец/Собственник в тех случаях, когда Владелец (колесо) должен знать об Владельце. –

+1

@njpaul Возможно, вы захотите ознакомиться с документами '' std :: rc' (http://doc.rust-lang.org/std/rc/index.html). У них есть хороший пример отношений между владельцем и владельцем. – Shepmaster

Смежные вопросы