2017-07-01 100 views
7

我正在尝试生成素数。代码需要存储所有生成的素数(生成下一个素数),有一些私有函数可以提供帮助,一个公共函数(generate_next_prime)。是否可以在Rust中创建一个私有变量?

在Java或C++中,我会写一个PrimesGen类,但是在Rust中,在结构中不能有私有变量。在Python中,我可能会写一个PrimesGen模块,但在Rust模块中不能有变量。

此代码编译并运行:

struct PrimesGen { 
    primes_so_far: Vec<i32>, 
    next_candidate: i32, 
} 

impl PrimesGen { 
    pub fn new() -> PrimesGen { 
     PrimesGen { 
      primes_so_far: vec![], 
      next_candidate: 2, 
     } 
    } 
} 

fn main() { 
    let pg: PrimesGen = PrimesGen::new(); 
    println!("{}", pg.next_candidate); 
} 

所以,我该怎么办?

+1

领域的结构是由默认私人。 –

+0

@FrancisGagné我加了我的代码,我做错了什么? – Neo

+0

您与定义'PrimesGen'的文件相同,因此您可以随心所欲地做任何事情。 – loganfsmyth

回答

9

在Rust中,文件隐式是一个模块。当您将一些代码放在foo.rs文件中时,如果要使用此代码,则必须键入mod foo;,因为此文件的名称隐含地是模块的名称。主文件不是例外:它是一个模块(基本模块)。

现在,在一个模块内部,一切都可以访问所有内容。见被说服这个小例子:

struct Foo { 
    x: i32, // private 
} 

struct Bar {} 

impl Bar { 
    fn foo(f: Foo) { 
     let _ = f.x; 
    } 
} 

fn main() { 
    let f = Foo { x: 42 }; 
    Bar::foo(f); 
} 

Bar可以访问的Foo私有成员:拉斯特,能见度的工作原理是模块,而不是结构。在同一个模块中,你不能对同一个模块进行私人操作。

所以,如果你想在你的榜样的私有变量,把你的一个模块内部结构和实现:

mod prime { 
    pub struct PrimesGen { 
     primes_so_far: Vec<i32>, 
     next_candidate: i32, 
    } 

    impl PrimesGen { 
     pub fn new() -> PrimesGen { 
      PrimesGen { 
       primes_so_far: vec![], 
       next_candidate: 2, 
      } 
     } 
    } 
} 

fn main() { 
    use prime::*; 

    let pg: PrimesGen = PrimesGen::new(); 
    println!("{}", pg.next_candidate); // error: field is private 
} 
+1

所以答案是没有大文件。可爱。 – Squirrel

+2

@Squirrel不知道我该如何解释你的评论。你不需要*使用小模块(我想你想编写“模块”),但确实是保持模块简单的一个非常好的做法。 – Boiethios

相关问题