是否可以在 Rust 中创建私有变量?
Is it possible to make a private variable in Rust?
我正在尝试生成质数。代码需要存储所有生成的素数(以生成下一个素数),需要一些私有函数来帮助和一个 public 函数(generate_next_prime
)。
在 Java 或 C++ 中,我会写 PrimesGen
class,但在 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);
}
那我该怎么办?
在 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);
}
Bar
可以访问 Foo
的私有成员:在 Rust 中,可见性按模块而不是结构工作。在同一个模块内,你不能对同一个模块做一些私有的事情。
因此,如果您想在您的示例中将变量设为私有,请将您的结构和实现放在一个模块中:
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
}
我正在尝试生成质数。代码需要存储所有生成的素数(以生成下一个素数),需要一些私有函数来帮助和一个 public 函数(generate_next_prime
)。
在 Java 或 C++ 中,我会写 PrimesGen
class,但在 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);
}
那我该怎么办?
在 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);
}
Bar
可以访问 Foo
的私有成员:在 Rust 中,可见性按模块而不是结构工作。在同一个模块内,你不能对同一个模块做一些私有的事情。
因此,如果您想在您的示例中将变量设为私有,请将您的结构和实现放在一个模块中:
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
}