首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nim :如何约束现有类型

Nim :如何约束现有类型
EN

Stack Overflow用户
提问于 2022-02-23 18:35:25
回答 2查看 106关注 0票数 1

我有一个关于类型定义的问题。

我想限制一种现有的类型来强制执行某些附加的标准。例如,我想为DNA字符串构造一个类型。

DNA链可以看作是任意长串的字符,只包含'A','C','G','T‘(核苷酸)。类似地,我将RNA字符串定义为只有字母'A‘、'C’、'G‘、'U’的字符串。

RNA字符串可以分解为密码子,即在四个核苷酸中只有三个字符的字符串('A','C','G','U')。我能做一个密码子类型,自动检查(例如在初始化或类型转换后),字符串是否长度为3,是否包含除有效字符以外的任何其他字符?

我尝试使用一种概念类型:

代码语言:javascript
复制
var
  NucleotideSet: set[char] = {'A','C','G','U'}

type
  Nucleotide {.explain.} = concept var a
    a is char
    a in {'A','C','G','U'}

  RnaCodon = seq[Nucleotide]

但是这个实验特性并不强制现有类型,它只检查一个类型是否验证了某些属性,但我可能弄错了。

我想要做的是操纵RNA字符串,而不必手动检查每个字符是否确实是一个核苷酸。

对于上述代码中的定义,下列操作失败:

代码语言:javascript
复制
echo 'A' is Nucleotide

我得到一个类型错配:‘a’是焦炭,但预期的核苷酸。在这个例子中,我做错了什么,如何修复它来定义RNAstring和密码子?我现在的猜测是,在概念类型中,a不是类型,而是变量,我可能需要这样写:

代码语言:javascript
复制
type
  Nucleotide {.explain.} = concept var a, type T
    a is T
    T is char
    a in {'A','C','G','U'}

但我也得到了一个类型错配错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-24 10:49:34

据您解释,您唯一的问题是,您希望有一种变量,如果您确定只有某个值是持有的。我会使用普通字符串作为独特的类型。文档中的避免sql注入攻击部分解释了这个词是如何使用的:

  1. 为DNA和RNA链创建一个独特的字符串。
  2. 创建一个验证/解析函数,将任何输入转换为DNA或RNA不同的字符串。
  3. 对于每个输入字符串,将输入传递给这些转换函数。如果它们是有效的DNA/RNA,则函数将返回转换为不同类型的字符串,否则输入将被丢弃并/或生成错误。
  4. 从那时起,其他代码只使用不同的类型,因此您不能在那里传递未经验证的字符串,并且确信发送给那些procs的数据已经过验证。

当您使用不同的类型时,您甚至不需要检查某个不同类型的元素是否是核苷酸,因为您的输入验证/转换proc已经处理过一次了。

票数 1
EN

Stack Overflow用户

发布于 2022-02-24 18:32:58

概念不适用于运行时(甚至在VM中运行)“方面”。例如,它绑定到每种类型(请参阅“概念诊断”之前的实验手册部分的最后一段),仅绑定一定长度的seq是不可能的,因为不同长度的seq不是不同的类型。角色也是一样。

您必须执行杂技操作,并在用户创建的类型中静态地将字符指定为泛型参数,类似于第一个示例AnyMatrix中的这里概念。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71242378

复制
相关文章

相似问题

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