2015-06-05 9 views
5

Tôi đang sử dụng rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14) và tôi đã có các thiết lập sau:Tiếp cận submodule từ submodule khác khi cả hai submodules là trong các mô-đun chính cùng

my_app/ 
| 
|- my_lib/ 
| | 
| |- foo 
| | |- mod.rs 
| | |- a.rs 
| | |- b.rs 
| | 
| |- lib.rs 
| |- Cargo.toml 
| 
|- src/ 
| |- main.rs 
| 
|- Cargo.toml 

src/main.rs:

extern crate my_lib; 

fn main() { 
    my_lib::some_function(); 
} 

my_lib/lib.rs:

pub mod foo; 

fn some_function() { 
    foo::do_something(); 
} 

my_lib/foo/mod.rs:

pub mod a; 
pub mod b; 

pub fn do_something() { 
    b::world(); 
} 

my_lib/foo/a.rs:

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

my_lib/foo/b.rs:

use a; 
pub fn world() { 
    a::hello(); 
} 

Cargo.toml:

[dependencies.my_lib] 
path = "my_lib" 

Khi tôi cố gắng biên dịch nó tôi nhận được lỗi sau đây ném cho tuyên bố use trong B.rs:

unresolved import `A`. There is no `A` in `???` 

Tôi đang thiếu gì? Cảm ơn.

Trả lời

7

Vấn đề là use đường dẫn là tuyệt đối, không tương đối. Khi bạn nói use A; những gì bạn đang thực sự nói là "sử dụng biểu tượng A trong mô-đun gốc của thùng này", sẽ là lib.rs.

Những gì bạn cần sử dụng là use super::A;, hoặc đường dẫn đầy đủ: use foo::A;.

Tôi đã viết một bài báo trên Rust's module system and how paths work có thể giúp xóa điều này nếu Rust Book chapter on Crates and Modules không.

+0

Vâng xin lỗi, 'B :: world()' thực sự được bao bọc trong một hàm khác. Tôi đang sử dụng hàng hóa để biên dịch dự án. Có thể là một lỗi trong hàng hóa sau đó? – morcmarc

+0

Nếu sử dụng Hàng hóa là cần thiết để tái sản xuất, vui lòng đăng tệp 'Cargo.toml' của bạn. Khi nó đứng, ví dụ như được biên dịch tốt. –

+0

Nó hoạt động. Cảm ơn bạn đã làm rõ nó. Tuy nhiên nó có phải là thành ngữ để sử dụng 'super :: module_name'? Nó cảm thấy hơi khó xử. – morcmarc

Các vấn đề liên quan