在Erlang中伪输入是获取类型的方式吗?

时间:2010-03-19 20:18:58

标签: erlang

例如,要表示我可以使用的字符串:

{字符串 “hjggjhhggJ”}

,列表如下:

{list,[1,2,3]}

:我想我发现我遇到了需要类型的情况,例如区分字符串和列表,我不知道如何继续。但是我想在我的Erlang应用程序中使用我选择的任何技术来保持一致性,而不仅仅是字符串和列表。有什么建议吗?

更新: 我使用它的一个示例是当我将数据值存储在Riak数据存储区中时,它允许您存储列表或字符串。

4 个答案:

答案 0 :(得分:4)

如果您需要区分这种方式 - 是的,您可以这样做。但是,除非绝对必要,否则动态类型的一般概念不是区分类型。 (我觉得这个问题值得商榷,这对于像erlang这样的非oop语言有多少 - 我很想听听其他人对这个话题的看法)

然而,有时候,区分是非常有用的。在我的一个项目中,我有一个字符串,它将经历不同的转义阶段,具体取决于输入字符串应该发生的事情。输出未正确转义的字符串可能会带来安全风险。为了使这更安全,我把它作为一个标记的元组:

{my_string, false, false, ActualString}

当一个转义/处理阶段发生时,我可以切换布尔值:

{my_string, true, false, ActualString}

然后接收字符串的输出函数可以匹配某些条件:

output_html_escaped_string({my_string, true, _, ActualString}) -> ...

这样,如果我偶然传递一个未处理的字符串,该函数会引发一个异常(我记得发生了一次或两次:)。

答案 1 :(得分:2)

是。这也用于区分相同类型的多个构造函数(并不是Erlang确实存在差异)。例如,标准库中的许多函数被指定为返回{error, Reason}{ok, Value}

答案 2 :(得分:1)

不确定它是否是您需要的,但您可以使用保护表达式来区分不同类型。请提供更多关于您的观点的输入/示例,以便我可以提供更多帮助。

答案 3 :(得分:1)

一般来说,你可能不想做{string," ABC"}可能更有用的是{username," ABC"}或者比如标签不是字符串或列表中的数据类型,而是应用程序将如何使用该数据。通过这种方式,您可以根据数据的含义进行模式匹配,而不是它是什么

您可以使用警卫(虽然erlang中的字符串是字符列表)