2014-03-18 64 views
3

簡單的防鏽問題,我似乎無法找到答案:正確的方式使用防鏽結構從其他MODS

我已經定義在一個單獨的文件的結構。當我想在文件的頂部使用該支撐做這樣的事情:

use other_file::StructName; 
mod other_file; 

當我創建一個使用此類型

fn test(other : StructName) {}; 

我得到一個有關使用私有類型警告的功能。我寫的時候這個錯誤是固定的:

fn test(other : other_file::StructName) {}; 

雖然這需要大量額外的輸入。我也可以用pub use將模塊再次導出,但我真的想保留它隱藏。

如何正確包含模塊以保存輸入?相當於我想要的蟒蛇是

from other_file import StructName 

=====編輯/示例代碼=======

上面的代碼似乎沒有再現或描述我有問題。以下確定在2個文件中。它是一些矩陣數學應用的精簡版。

geometry.rs

use geometry::{Vec3}; 
mod geometry; 

#[deriving(Eq, Clone, Show)] 
pub struct Mat4 { 
    data : ~[f32] 
} 

impl Mat4 { 

    fn apply_Vec3(&self, other : &Vec3) -> Vec3{ 
    let x = self.data[0] * other.x + self.data[1] * other.y + self.data[2] * other.z; 
    let y = self.data[4] * other.x + self.data[5] * other.y + self.data[6] * other.z; 
    let z = self.data[8] * other.x + self.data[9] * other.y + self.data[10]* other.z; 
    Vec3::new(x, y, z) 
    } 
} 

#[deriving(Eq, Clone, Show)] 
pub struct Transform { 
    mat : Mat4 
} 

impl Transform { 
    pub fn apply_Vec3(&self, vec : &Vec3) -> Vec3 { 
    self.mat.apply_Vec3(vec) 
    } 
} 

transform.rs

#[deriving(Eq, Clone, Show)] 
pub struct Vec3 { 
    x : f32, 
    y : f32, 
    z : f32 
} 
impl Vec3 { 
    pub fn new(x : f32, y : f32, z : f32) -> Vec3 { 
    Vec3{x : x, y : y, z : z} 
    } 
} 

當rustc --test transform.rs編譯,我得到兩個錯誤:

transform.rs:25:39: 25:43 warning: private type in exported type signature, #[warn(visible_private_types)] on by default 
transform.rs:25  pub fn apply_Vec3(&self, vec : &Vec3) -> Vec3 { 
                 ^~~~ 
transform.rs:25:48: 25:52 warning: private type in exported type signature, #[warn(visible_private_types)] on by default 
transform.rs:25  pub fn apply_Vec3(&self, vec : &Vec3) -> Vec3 { 
                   ^~~~ 
+0

鑑於對回送一個專用型的警告,這顯然不是你做的相當的。你能分享你的整個代碼庫嗎? –

+0

更新並添加完整的代碼示例。對不起,缺乏清晰度。 – luke

回答

5

我假設你實際上是返回other_file::StructName;否則你不會得到這個警告。

問題是,從其他地方,您實際上無法訪問other_file::StructName的類型。當您訪問它時,我認爲StructName是公開的,但這不足以讓此模塊以外的其他組件訪問它:模塊other_file也需要公開。

更換

mod other_file; 

pub mod other_file; 

use說法是正確的,確實對應的Python from x import y聲明。 (大約只;除非selfsuper進入它,那些會在Python .foo..foo這是一個絕對路徑)

+0

這正是我所期待的。謝謝!你對我的結構是公有的以及返回other_file :: StructName是正確的。對不起,這個可怕的代碼片段。應該真的不是那麼懶惰...... – luke

2

生鏽,一切默認情況下是私有的(只有少數例外,文檔中的see this)。所以,問題可能是您的結構StructName對於other_file模塊是私有的。

如果您聲明struct在例如「 b.rs

pub struct StructName {x: int, y: int} 

你可以成功地使用它在例如a.rs,你寫道:

use b::StructName; 
mod b; 
fn test (s: StructName) -> int {return s.x + s.y;} 
fn main() { 
    let s = StructName {x: 1, y: 2}; 
    let t = test (s); 
    println! ("{:i}", t); 
} 

這種成功具有防鏽0.9和輸出3編譯。

+0

「在Rust中,默認情況下一切都是私密的。」不是真的;目前,公共枚舉上的變體和結構體上的字段默認是公共的。 –

+0

@Chris Morgan:澄清並添加了文檔鏈接,謝謝。 – Gassa