是否可以在Rust中创建一个私有变量?

Neo*_*Neo 10 private rust

我正在尝试生成素数.代码需要存储所有生成的素数(以生成下一个),有一些私有函数来帮助和一个公共函数(generate_next_prime).

在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);
}
Run Code Online (Sandbox Code Playgroud)

那我该怎么办?

Fre*_*ios 17

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

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

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);
}
Run Code Online (Sandbox Code Playgroud)

Bar可以访问以下的私有成员Foo:在Rust中,可见性由模块工作,而不是struct.在同一模块内部,您无法对同一模块执行私有操作.

因此,如果要在示例中将变量设为私有,请将结构和实现放在模块中:

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
}
Run Code Online (Sandbox Code Playgroud)

  • @Squirrel不确定我必须如何解释你的评论.你没有*使用小模块(我认为你想写"模块")但确实是保持模块简单的一个很好的做法. (7认同)
  • 所以答案是没有大文件.可爱. (4认同)
  • @Sahsahae你声称“ctrl+c ctrl+v”比函数更快、更易于维护,这很奇怪。此外,“ed”已经过时了。 (4认同)