我有一个带有一个字符串字段的简单结构:
pub struct Chunk {
signature: String
}
这个字符串字段不能只是任何字符串,它需要满足很多约束(如果传递给构造函数的字符串不满足这些约束,则结构的构造应该失败)。
在像 C++ 这样的面向对象语言中,我会创建显式构造函数来执行所需的检查,在 Rust 中执行此操作的正确方法是什么?
我想出了这段代码:
impl Chunk {
pub fn new(s: String) -> Option<Chunk> {
if constraints_fail {
None
} else {
Some(Chunk{signature: s})
}
}
}
我不确定这是否是正确的方法,因为从技术上讲,该结构仍然可以使用无效的字符串参数进行实例化,而无需调用此函数。
最佳答案
您的结构包含一个私有(private)字段,因此无法从外部实例化它。如果你尝试的话,你会得到以下结果:
error[E0451]: field `signature` of struct `Chunk` is private
--> src/main.rs:8:24
|
8 | let _ = Chunk { signature: "xxx".to_owned() };
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ private field
您无需执行任何其他操作 - 只需将signature
字段设为私有(private)即可。
关于struct - 如何向结构体的字段添加约束以进行实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63654743/