2014-12-13 118 views
0

我有简单的代码,导入2个模块并使用它们的结构。
main.rs我使用的是从机器人/ maintrait.rsgamecore \ board.rs他们都是进口的方式一样,但FUNC从maintrait.rs功能不能得到解决。
这里是我的src目录的结构:模块导入失败

. 
├── bots 
│   ├── maintrait.rs 
│   └── mod.rs 
├── gamecore 
│   ├── board.rs 
│   └── mod.rs 
└── main.rs 

和代码:

main.rs

use gamecore::{GameBoard,State}; 
use bots::{Bot,DummyBot}; 

mod bots; 
mod gamecore; 

fn main() { 
    let board = GameBoard::new(); 
    let bot = DummyBot::new(State::O); 
    board.make_turn(State::X, (0, 0)); 
    board.make_turn(State::O, bot.get_move(&board)); 
} 

gamecore \ mod.rs

pub use self::board::{GameBoard,State}; 
mod board; 

gamecore \ board.rs

pub struct GameBoard { 
    field: [[State, ..3], ..3] 
} 

impl GameBoard { 
    pub fn new() -> GameBoard { 
     GameBoard { 
      field: [[State::Empty, ..3], ..3] 
     } 
    } 
... 
} 

机器人\ mod.rs

pub use self::maintrait::{Bot,DummyBot}; 
mod maintrait; 

机器人\ maintrait.rs

use gamecore::{GameBoard,State}; 
use std::rand; 

pub trait Bot { 
    fn new<'a>() -> Box<Bot + 'a>; 
    fn get_move(&mut self, board: &GameBoard) -> (uint, uint); 
} 

pub struct DummyBot { 
    side: State 
} 

impl Bot for DummyBot { 
    fn new<'a>(side: State) -> Box<Bot + 'a> { 
     box DummyBot{ 
      side: side 
     } 
    } 

    fn get_move(&mut self, board: &GameBoard) -> (uint, uint) { 
     let turn = rand::random::<uint>() % 9; 
     (turn/3, turn % 3) 
    } 
} 

ERROR MESSAGE

10:28 error: failed to resolve. Use of undeclared module `DummyBot` 
let bot = DummyBot::new(State::O); 
      ^~~~~~~~~~~~~ 
10:28 error: unresolved name `DummyBot::new` 
let bot = DummyBot::new(State::O); 
      ^~~~~~~~~~~~~ 

我在哪里错了?为什么2个相同的进口工作不同?

+0

我猜想从子模块中的'DummyBot'实现trait的问题,但我不知道如何解决这个问题,而不破坏代码结构。 – 2014-12-13 15:47:01

回答

1

Rust by Example有一个很好的例子,说明如何做类似的事情。

下面是需要改变的代码的相应位:

pub trait Bot { 
    // Your trait and implementation signatures differ, so I picked this one 
    fn new() -> Self; 
} 

impl Bot for DummyBot { 
    fn new() -> DummyBot { 
     DummyBot{ 
      side: State::Empty 
     } 
    } 
} 

let bot: DummyBot = Bot::new(); 

我猜了一点,但我认为,根本原因是,你还没有真正定义一个DummyBot::new,而是定义DummyBot碰巧实现的通用Bot::new。您必须调用定义的方法(Bot::new提供足够的信息以消除呼叫(let的类型)。