枚举之间1对1映射的穷尽性检查



我正在写一些基本的生物信息学代码,将DNA转录为RNA:

pub enum DnaNucleotide {
A,
C,
G,
T,
}
pub enum RnaNucleotide {
A,
C,
G,
U,
}
fn transcribe(base: &DnaNucleotide) -> RnaNucleotide {
match base {
DnaNucleotide::A => RnaNucleotide::A,
DnaNucleotide::C => RnaNucleotide::C,
DnaNucleotide::G => RnaNucleotide::G,
DnaNucleotide::T => RnaNucleotide::U,
}
}

有没有一种方法可以让编译器在match语句的右侧进行穷尽性检查,基本上确保两个枚举之间的1-1映射?

(一个相关的问题:上面可能用某种双射图更好地表示,但我不想失去穷尽性检查。有更好的方法吗?(

事实上,两个枚举之间存在一对一的对应关系,这表明您实际上应该在幕后只使用一个枚举。下面是一个我认为适合您需求的数据模型示例。这自然是详尽无遗的,因为一开始只有一个枚举。

use core::fmt::{Debug, Error, Formatter};
enum NucleicAcid {
Dna,
Rna,
}
enum Nucleotide {
A,
C,
G,
TU,
}
struct BasePair {
nucleic_acid: NucleicAcid,
nucleotide: Nucleotide,
}
impl BasePair {
fn new(nucleic_acid: NucleicAcid, nucleotide: Nucleotide) -> Self {
Self {
nucleic_acid,
nucleotide,
}
}
}
impl Debug for BasePair {
fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {
use NucleicAcid::*;
use Nucleotide::*;
let BasePair {
nucleic_acid,
nucleotide,
} = self;
let nucleic_acid_str = match nucleic_acid {
Dna => "dna",
Rna => "rna",
};
let nucleotide_str = match nucleotide {
A => "A",
C => "C",
G => "G",
TU => match nucleic_acid {
Dna => "T",
Rna => "U",
},
};
f.write_fmt(format_args!("{}:{}", nucleic_acid_str, nucleotide_str))
}
}
fn main() {
let bp1 = BasePair::new(NucleicAcid::Dna, Nucleotide::TU);
let bp2 = BasePair::new(NucleicAcid::Rna, Nucleotide::C);

println!("{:?}, {:?}", bp1, bp2);
// dna:T, rna:C
}

最新更新