【问题标题】:How to add a constraint to a field of a struct for instantiation?如何将约束添加到结构的字段以进行实例化?
【发布时间】:2020-12-18 14:59:57
【问题描述】:

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

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})
        }
    }
}

我不确定这是否是正确的方法,因为从技术上讲,结构仍然可以用无效的字符串参数实例化,而无需调用此函数。

【问题讨论】:

    标签: struct rust


    【解决方案1】:

    您的结构包含一个私有字段,因此它不能从外部实例化。如果你尝试,这就是你得到的:

    error[E0451]: field `signature` of struct `Chunk` is private
     --> src/main.rs:8:24
      |
    8 |     let _ = Chunk { signature: "xxx".to_owned() };
      |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^ private field
    

    您无需执行任何其他操作 - 只需将 signature 字段设为私有即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-27
      • 1970-01-01
      • 2020-02-29
      • 2016-04-05
      • 1970-01-01
      • 2015-11-30
      • 2021-06-24
      • 1970-01-01
      相关资源
      最近更新 更多