struct - 如何向结构体的字段添加约束以进行实例化?

标签 struct rust

我有一个带有一个字符串字段的简单结构:

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/

相关文章:

c++ - 你如何正确地初始化一个结构,它的成员是一个指向 const 值的 const 指针?

rust - 当输入非常清楚时,为什么借用检查器需要输出生命周期标签?

rust - 使用命令从 rust 获取文件

c - 有没有办法在 C 中巧妙地创建一个函数,使其在不同的参数值中执行不同的函数?

c - 结构数组函数参数

c - 如何通过更改其成员的顺序找到所有可以变得更小的结构

image-processing - 如何将 DynamicImage 转换为 Base64?

rust - 在 None 值上调用 unwrap 时,try block 中的代码仍然会出现 panic

objective-c - 如何确定某些 Objective-C 常量的实际值?

c++ - 在运行时在结构中处理可变数量的参数