以下允许将元组或对象转换回erlang中的对象:
{ok, Tokens, _} = erl_scan:string("{'abc',123}."),
{ok, X} = erl_parse:parse_term(Tokens).
但是当你有一个表示为字符串的记录时,例如:
-record(myrecord,{firstname,lastname,age}).
...
RecString = "#myrecord{firstname='john',lastname='doe',age=22}.",
{ok, Tokens, _} = erl_scan:string(RecString),
{ok, X} = erl_parse:parse_term(Tokens).
......上述内容将失败并显示以下消息:
**异常错误:没有右侧值匹配{error,{1,erl_parse,[“之前的语法错误:”,[]]}}
关于如何实现这一目标的想法?感谢。
答案 0 :(得分:4)
首先,您必须记住,记录不存在作为数据类型,内部记录是元组,其中第一个元素是记录的名称。所以你的记录定义是:
-record(myrecord,{firstname,lastname,age}).
使用
创建记录#myrecord{firstname='john',lastname='doe',age=22}
会导致元组
{myrecord,john,doe,22}
只包含实际数据。这是记录的定义方式,请参阅here。
第二点是记录是纯编译时语法结构,编译器在元组操作中进行转换。因此,记录的定义不存在于任何地方的数据。只有编译器知道记录定义。因此,当您打印记录时,您看到的只是元组。但是,您可以在shell中定义记录,以便在shell中使用记录语法,请参阅shell documentation。
因此,从这个意义上讲,您无法真正将记录转换为其字符串表示形式。您可以解析字符串,但这只返回抽象语法,而不是您所使用的语法。它们是表达式,因此您需要使用.
结束字符串并使用erl_parse:exprs/1
。
希望这会有所帮助。你想做什么?或者更确切地说为什么你想要这样做?