如何验证结构创建?
我正在通过示例研究Rust。我目前在TryFrom
和TryInto
。这是他们的代码:
struct EvenNumber(i32);
impl TryFrom<i32> for EvenNumber {
type Error = ();
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value % 2 == 0 {
Ok(EvenNumber(value))
} else {
Err(())
}
}
}
struct EvenNumber(i32);
impl TryFrom<i32> for EvenNumber {
type Error = ();
fn try_from(value: i32) -> Result<Self, Self::Error> {
if value % 2 == 0 {
Ok(EvenNumber(value))
} else {
Err(())
}
}
}
该实现防止创建EvenNumber
具有奇数的实例,但前提是我调用try_from
(或try_into
)。我仍然可以EvenNumber(1337)
直接创建一个。
在 Java(和相关语言)中,可以验证构造函数内的实例创建,例如:
如何在 Rust 中做到这一点?
回答
您将EvenNumber
在某个模块内定义并保持其num
字段私有,因此人们可以创建实例的唯一方法EvenNumber
是通过您控制的公共方法,例如new
. 例子:
mod some_mod {
pub struct EvenNumber {
num: i32,
}
impl EvenNumber {
pub fn new(num: i32) -> Result<Self, ()> {
if num % 2 == 0 {
Ok(EvenNumber {
num,
})
} else {
Err(())
}
}
}
}
// bring EvenNumber into scope
use some_mod::EvenNumber;
fn try_to_create_invalid_even_number() -> EvenNumber {
EvenNumber {
num: 1337, // compile error
}
}
抛出:
error[E0451]: field `num` of struct `EvenNumber` is private
--> src/lib.rs:24:9
|
24 | num: 1337,
| ^^^^^^^^^ private field
操场