簡體   English   中英

Rust 禁用結構構造

[英]Rust disable struct construction

如何在 Rust 中禁用結構構造但保持模式匹配?

讓我們看一個例子:

struct OrderedPair(pub u32, pub u32);

impl OrderedPair {
    fn new(a: u32, b: u32) -> Self {
        if a < b {
            Self(a, b)
        } else {
            Self(b, a)
        }
    }
}

很明顯,我想禁止構建這種結構(例如OrderedPair(2, 1) )並只使用new方法,以保持不變性。 我知道 3 種方法可以做到這一點:

  1. 將字段設為私有
struct OrderedPair(u32, u32);
  1. 添加私有虛擬字段
struct OrderedPair(pub u32, pub u32, ());
  1. 使結構不詳盡
#[non_exhaustive]
struct OrderedPair(pub u32, pub u32);

問題是 1 我根本無法訪問成員,而所有三個我都無法使用模式匹配

let OrderedPair(min, max) = my_ordered_pair;

那么有沒有辦法阻止結構構造但允許模式匹配?

我知道,如果我們聲明一個具有對成員的公共訪問權限的該類型的可變變量,那么可以通過手動更改成員來破壞不變量,但現在避免使用 struct 構造函數就足夠了。

您可以在返回的元組上進行,而不是直接在字段上進行模式匹配:

#[derive(Clone, Copy)]
pub struct OrderedPair {
    a: u32,
    b: u32,
}
impl OrderedPair {
    pub fn content(self) -> (u32, u32) {
        (self.a, self.b)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM