首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >枚举间1到1映射的Exhaustivity检验

枚举间1到1映射的Exhaustivity检验
EN

Stack Overflow用户
提问于 2021-11-16 15:36:30
回答 1查看 99关注 0票数 2

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

代码语言:javascript
复制
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映射?

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

EN

回答 1

Stack Overflow用户

发布于 2021-11-16 19:47:38

事实上,一对一的通信存在于两个枚举之间,这意味着您实际上应该只在幕后使用一个枚举。我认为适合您需要的数据模型的下面是一个例子。这当然是详尽无遗的,因为一开始只有一个枚举。

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69992014

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档