【发布时间】:2013-11-07 15:45:27
【问题描述】:
在 Erlang 中,\" 是一个转义字符,表示双引号。
我的问题是,"\"test\"" 和 ""test"" 有什么区别?我问的原因是因为,我正在尝试处理 list_to_atom 错误:
> list_to_atom("\"test\"").
'"test"'
> list_to_atom(""test"").
* 1: syntax error before: test
【问题讨论】:
在 Erlang 中,\" 是一个转义字符,表示双引号。
我的问题是,"\"test\"" 和 ""test"" 有什么区别?我问的原因是因为,我正在尝试处理 list_to_atom 错误:
> list_to_atom("\"test\"").
'"test"'
> list_to_atom(""test"").
* 1: syntax error before: test
【问题讨论】:
"" 是长度为 0 的字符串/列表
\" 在字符串上下文中使用时只是一个转义的双引号。如果你想要一个只包含双引号的字符串(即\"),那么你可以这样做:"\""。
""test"" 是一个语法错误,与"" test "" 语法上的<list><atom><list> 没有区别。你想完成什么?
【讨论】:
不建议动态生成原子,因为它们永远不会被垃圾回收。
阅读用户输入时最好使用list_to_existing_atom/1。否则,您可能最终会耗尽内存(在一个运行足够长的系统中;但是,嘿,这就是 Erlang 的系统,不是吗?)并使整个虚拟机崩溃。
list_to_existing_atom/1 会在原子不存在的情况下抛出错误,如果原子存在则返回。像catch list_to_existing_atom(some_atom) 这样的构造与case .. of 或try ... catch 块结合使用可能会很有用。在 shell 中尝试一下,看看你最喜欢什么。
如果这个答案似乎与问题无关,那么请注意我还不允许发布 cmets,所以这回答了对chops'答案的评论中的问题,即:
我必须编写一个从键盘读取直到输入原子的函数。 我必须用 get_line 和 list_to_atom 来做这件事。 – otisonoza
【讨论】: