在Erlang中,\"
是一个转义字符,表示双引号。
我的问题是,"\"test\""
和""test""
之间有什么区别?我问的原因是因为,我正在尝试处理list_to_atom
错误:
> list_to_atom("\"test\"").
'"test"'
> list_to_atom(""test"").
* 1: syntax error before: test
答案 0 :(得分:5)
""
是长度为0的字符串/列表
\"
只是一个转义的双引号。如果你想要一个只包含双引号的字符串(即\"
),那么你可以这样做:"\""
。
""test""
是语法错误,与语法"" test ""
的{{1}}没有区别。你想要完成什么?
答案 1 :(得分:2)
不建议动态生成原子,因为它们从不被垃圾收集。
在阅读用户输入时,最好使用list_to_existing_atom/1
。否则,你可能最终会耗尽内存(在一个运行得足够长的系统中;但是,嘿,这就是Erlang所用的系统,不是吗?)并使整个虚拟机崩溃。
list_to_existing_atom/1
将在原子不存在时抛出错误并返回原子(如果存在)。像catch list_to_existing_atom(some_atom)
这样的构造可能会与case .. of
或try ... catch
块一起使用。在shell中试一试,看看你最喜欢什么。
如果这个答案似乎与这个问题无关,那么请注意我还不能发表评论,所以这回答了对chops答案的评论中的问题,即:
我必须编写一个从键盘读取的函数,直到键入一个原子。 我必须使用get_line和list_to_atom执行此操作。 - otisonoza