2014-10-28 51 views
3

不可见我有下面的代码:一般性状外部模块

pub trait Osm<T> { 
    fn get_points(&self) -> Vec<Point<T>>; 
} 

#[deriving(Show, PartialEq, Clone)] 
pub struct Point<T> { 
    pub lat: T, 
    pub lon: T, 
} 

#[deriving(Show, PartialEq, Clone)] 
pub struct Node<T> { 
    pub point: Point<T>, 
} 

impl<T: Clone> Osm<T> for Node<T> { 
    fn get_points(&self) -> Vec<Point<T>> { 
     return vec![self.point.clone()]; 
    } 
} 

当我把这个代码,主要和拨打:

let b = Node { point: Point { lat: 10i64, lon: 12i64 }}; 
println!("{}", b.get_points()); 

一切工作的罚款。

但是,当我把它放到另一个模块得到一个错误:

/prj/src/main.rs:64:22: 64:34 error: type `osm::test::Node<i64>` does not implement any method in scope named `get_points` 
/prj/src/main.rs:64  println!("{}", b.get_points()); 
             ^~~~~~~~~~~~ 
error: aborting due to previous error 

我有点困惑,为什么它不能正常工作,可能是让因为主要的私有方法都做工精细,但当我尝试使用pub它显示的关键字unnecessary visibility qualifier构建错误。那么我可以为外部模块使用通用特征吗?

回答

6

要在不同的模块使用特质的方法,你需要先use性状。

所以use osm::test::Osm;应该工作。这是use语句导入功能而不是仅提供标识符的唯一情况。

此外,方法不需要显式pub s对于pub trait s,因为导出特征会导出方法。