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