如何验证结构创建?

我正在通过示例研究Rust。我目前在TryFromTryInto。这是他们的代码:

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

操场


以上是如何验证结构创建?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>