我在try 生成素数.一些prime需要存储下一个prime函数(一些prime需要存储下一个prime函数).

在java或C++中,我会写一个PrimesGen类,但是在Rust 中, struct 中不能有私有变量.在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中,可见性是按模块工作的,而不是按 struct 工作的.在同一个模块内,您不能对同一个模块执行私有操作.

因此,如果想在示例中使变量私有,请将 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
}

Rust相关问答推荐

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

什么样的 struct 可以避免使用RefCell?

当Option为None时,Option数组是否占用Rust中的内存?

如何处理动态 struct 实例化?

当rust中不存在文件或目录时,std::FS::File::Create().unwire()会抛出错误

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

在自定义序列化程序中复制serde(With)的行为

告诉Rust编译器返回值不包含构造函数中提供的引用

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

`*mut[T]`与`*mut T`的区别

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

如何执行数组文字的编译时串联?

为什么某些类型参数仅在特征边界中使用的代码在没有 PhantomData 的情况下进行编译?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

在 Rust 中查找向量中 dyn struct 的索引

为什么这段 Rust 代码会在没有递归或循环的情况下导致堆栈溢出?

Rust 中的 Option as_ref 和 as_deref 有什么不同

如何从 x86_64 Mac 构建 M1 Mac?

如何将切片推入数组?

如何在不设置精度的情况下打印浮点数时保持尾随零?