2015-01-18 3 views
4

Скажем, у меня есть этот файл иерархии:Переместить структуру в отдельный файл без разделения на отдельный модуль?

main.rs 
protocol/ 
protocol/mod.rs 
protocol/struct.rs 

В struct.rs:

pub struct Struct { 
    members: i8 
} 

impl Struct { 
    pub fn new() -> Struct { 
     Struct { 4 } 
    } 
} 

Как получить доступ как:

mod protocol; 
protocol::Struct::new(); 
// As opposed to: 
// protocol::struct::Struct::new(); 

Я пробовал различные комбинации из pubuse и mod, но, по общему признанию, я трясусь от вещей вслепую.

Можно ли разделить структуру (и ее impl) в отдельный файл без необходимости создавать новый мод?

ответ

4

Короткий ответ: используйте pub use Type в своем mod.rs. Полный пример следующим образом:

Моя структура:

/src/main.rs 
/src/protocol/ 
/src/protocol/mod.rs 
/src/protocol/thing.rs 

main.rs

mod protocol; 

fn main() { 
    let a = protocol::Thing::new(); 
    println!("Hello, {:?}", a); 
} 

протокол/mod.rs

pub use self::thing::Thing; 
mod thing; 

протокол/вещь. rs

#[derive(Show)] 
pub struct Thing(i8); 

impl Thing { 
    pub fn new() -> Thing { Thing(4) } 
} 

Как домашнего хозяйства бит, не называйте файлы то же самое, как ключевые слова языка. struct вызывает проблемы с компиляцией, поэтому я переименовал ее. Кроме того, ваш синтаксис создания структуры был неправильным, поэтому я выбрал более короткую версию для этого примера^_ ^.

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

+1

Это было 'self' в' pub use self :: thing :: Thing', который достал меня, видимо –

+0

Ха-ха, я набросился на то, чтобы скомпилировать себя. Я не знаю, что я обычно глубже, чем один уровень модулей. Я чувствую себя более широким, а более плотным является то, что я видел в ржавчине. – Shepmaster

+1

Nitpick: есть макрос 'include!', Который * может * использоваться для разделения одного модуля на несколько файлов. Это, возможно, неправильное использование, хотя, поскольку AFAIU было добавлено к сценариям генерации кода кэша –