gpt4 book ai didi

validation - 如何验证结构创建?

转载 作者:行者123 更新时间:2023-12-03 11:27:18 26 4
gpt4 key购买 nike

我正在处理 Rust by Example .我目前在TryFrom and 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(())
}
}
}

该实现阻止创建具有奇数的 EvenNumber 实例,但前提是我调用 try_from(或 try_into)。我仍然可以直接创建一个 EvenNumber(1337)

在 Java(和相关语言)中,可以在构造函数中验证实例创建,例如:

class EvenNumber {
public final int value;

public EvenNumber(int value) {
if (value % 2 != 0) {
throw new IllegalArgumentException("value is odd");
}
this.value = value;
}
}

如何在 Rust 中做到这一点?

最佳答案

您将在某个模块中定义 EvenNumber 并将其 num 字段保密,因此人们创建 EvenNumber 实例的唯一方法是通过您控制的公共(public)方法,例如 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
}
}

throw :

error[E0451]: field `num` of struct `EvenNumber` is private
--> src/lib.rs:24:9
|
24 | num: 1337,
| ^^^^^^^^^ private field

playground

关于validation - 如何验证结构创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65375808/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com