2014-10-15 4 views
44

Следуя this guide Я создал проект грузаКак включить модуль из другого файла из того же проекта?

SRC/main.rs

fn main() { 
    hello::print_hello(); 
} 

mod hello { 
    pub fn print_hello() { 
     println!("Hello, world!"); 
    } 
} 

, который я бегу с помощью

cargo build && cargo run 

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

Мой проект дерево выглядит следующим образом

├── src 
   ├── hello.rs 
   └── main.rs 

и содержание файлов:

SRC/main.rs

use hello; 

fn main() { 
    hello::print_hello(); 
} 

SRC/hello.rs

mod hello { 
    pub fn print_hello() { 
     println!("Hello, world!"); 
    } 
} 

Когда я скомпилирую его с помощью cargo build я

modules/src/main.rs:1:5: 1:10 error: unresolved import (maybe you meant `hello::*`?) 
modules/src/main.rs:1 use hello; 
                ^~~~~ 
error: aborting due to previous error 
Could not compile `modules`. 

Я пытался следовать предложениям компилятора и модифицированный main.rs к

#![feature(globs)] 

extern crate hello; 

use hello::*; 

fn main() { 
    hello::print_hello(); 
} 

, но это еще не помогает, теперь я получаю эту

modules/src/main.rs:3:1: 3:20 error: can't find crate for `hello` 
modules/src/main.rs:3 extern crate hello; 
               ^~~~~~~~~~~~~~~~~~~ 
error: aborting due to previous error 
Could not compile `modules`. 

Есть ли тривиальный пример того, как включить один модуль из текущего проекта в основной файл проекта?

Кроме того, я бегу ржавчина 0.13.0-nightly и груз 0.0.1-пред-ночной.

+1

возможно дубликат [основных импорта ржавчины (включает в себя)] (http://stackoverflow.com/questions/26224947/rust-basic-imports-includes) – Levans

+0

Связано с http://stackoverflow.com/questions/22596920/split-a-module-across-several-files – Kelvin

ответ

89

Вам не нужен mod hello на вашем hello.rs файлах. Код в любом файле, но корень корзины (main.rs для исполняемых файлов, lib.rs для библиотек) автоматически заменяется на модуль.

Чтобы добавить код от hello.rs на свой main.rs, используйте mod hello;. Он расширяется до кода, который находится на hello.rs (точно так же, как и раньше). Ваша структура файлов продолжается то же самое, и ваш код должен быть немного изменен:

main.rs:

mod hello; 

fn main() { 
    hello::print_hello(); 
} 

hello.rs:

pub fn print_hello() { 
    println!("Hello, world!"); 
} 
+0

Поздний вопрос не будет работать, если я укажу его с помощью hello вместо mod hello ?! –

+4

@ChristianSchmitt Нет, это разные вещи. 'use' - это просто объект пространства имен, а' mod' втягивается в файл. Вы могли бы использовать 'use', например, чтобы иметь возможность вызывать функцию' print_hello' без префикса с пространством имен –

+0

Это помогло мне. +1 и спасибо. –

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