2010-03-19 68 views
1

例如,为了表示一个字符串我可以使用:在Erlang中伪类型获得类型的方式?

{字符串 “hjggjhhggJ”}

和一个列表将是:

{列表,[1,2,3]}

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

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

+0

你可以给一个简单的例子,其中任意列表和字符串实际上是遵循相同的数据流? – Zed 2010-03-19 22:38:38

回答

4

如果您需要区分这种方式 - 是的,您可以这样做。尽管动态类型的一般概念不是为了区分类型,除非绝对必要。 (但我觉得这是有争议的,不过,这适用于像erlang这样的非oop语言 - 我很想听听其他人对这个话题的看法)

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

{my_string, false, false, ActualString} 

当逃逸/处理的一个阶段已经发生了,我可以切换布尔:接收

{my_string, true, false, ActualString} 

,然后输出功能字符串,可以匹配特定标准:

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

这样,如果我将它传递由事故未处理字符串函数将引发异常(我记得没有发生过一次或两次:)。

+0

是的,我想听听别人怎么做。你的字符串例子是你通过改变不同阶段的状态来为字符串添加“状态”?我不太明白 – Zubair 2010-03-19 22:32:30

+0

是的,基本上。我标记了字符串,并给了它一些额外的元信息,以后我可以方便地进行匹配。所有的中间函数都必须不改变地传递字符串,或者正确处理它。 – Amadiro 2010-03-19 22:52:01

2

是的。这也用于区分同一类型的多个构造函数(不是说Erlang有真正的区别)。例如,标准库中的许多函数被指定为返回{error, Reason}{ok, Value}

1

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

1

一般来说你可能不想做{字符串,“ABC”}可能更有用的东西就像{用户名,“ABC”}或类似的地方,其中标签不是什么样的数据是以字符串或列表的形式表示的,但是应用程序将如何使用该数据。这样,你可以对数据的含义模式匹配,而不是它是什么

您可以使用卫士(尽管在二郎一个字符串是字符的列表)