2015-06-06 14 views
5

Đang cố gắng để biên dịch follwing Rust đangSử dụng đặc điểm từ submodule với cùng một tên như struct

mod traits { 
    pub trait Dog { 
     fn bark(&self) { println!("Bow"); } 
    } 
} 

struct Dog; 

impl traits::Dog for Dog {} 

fn main() { 
    let dog = Dog; 
    dog.bark(); 
} 

đưa ra thông điệp lỗi

<anon>:13:9: 13:15 error: type `Dog` does not implement any method in scope named `bark` 
<anon>:13  dog.bark(); 
        ^~~~~~ 
<anon>:13:9: 13:15 help: methods from traits can only be called if the trait is in scope; the following trait is implemented but not in scope, perhaps add a `use` for it: 
<anon>:13:9: 13:15 help: candidate #1: use `traits::Dog` 

Nếu tôi thêm use traits::Dog;, sai số trở thành:

<anon>:1:5: 1:16 error: import `Dog` conflicts with type in this module [E0256] 
<anon>:1 use traits::Dog; 
      ^~~~~~~~~~~ 
<anon>:9:1: 9:12 note: note conflicting type here 
<anon>:9 struct Dog; 
     ^~~~~~~~~~~ 

Nếu tôi đổi tên trait Dog thành trait DogTrait, mọi thứ đều hoạt động. Nhưng làm thế nào tôi có thể sử dụng một đặc điểm từ một mô-đun con có cùng tên như một cấu trúc trong mô-đun chính của tôi?

Trả lời

4

Tôi không biết rằng có thể nhập cả hai, như xung đột tên. Xem llogiq's answer để biết cách nhập cả hai.

Nếu bạn không muốn nhập khẩu cả hai (hoặc không thể vì lý do gì), bạn có thể sử dụng Universal Chức năng Gọi Cú pháp (UFCS) sử dụng phương pháp của đặc điểm trực tiếp:

fn main() { 
    let dog = Dog; 
    traits::Dog::bark(&dog); 
} 
6

Bạn có thể làm sau đây để có được kết quả tương tự mà không cần đổi tên đặc điểm toàn cầu:

use traits::Dog as DogTrait; 

(some documentation)

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