【问题标题】:how to convert an erlang record from string representation back to a record如何将erlang记录从字符串表示形式转换回记录
【发布时间】:2013-02-02 05:25:14
【问题描述】:

以下允许将元组或对象转换回 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,["syntax error before: ",[]]}}

关于如何实现这一目标的想法?谢谢。

【问题讨论】:

    标签: erlang


    【解决方案1】:

    首先您必须记住,记录不作为数据类型存在,内部记录是元组,其中第一个元素是记录的名称。所以用你的记录定义:

    -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

    希望这会有所帮助。你想做什么?或者说为什么你要这么做?

    【讨论】:

    • 感谢您的澄清。实际上,我确实在字符串表示之后有点,但忘记在上面的示例中写了。它仍然没有解析。让我解释一下……
    • ...字符串不是来自记录本身,它是在 Java 应用程序上从 Java 对象构造的。我创建了一个 Java 方法“toErlangRecord()”,它将 Java 对象的 getter 方法转换为 Erlang 记录。字符串如#rec{x='a'}。然后将其从 Erlang 进程中作为消息获取,然后我们的想法是建立一个记录。我正在尝试将记录用作架构,而不是 json 或 xml。
    • 据我所知,您所描述的是不可能的。请参阅stackoverflow.com/questions/4132554/java-to-erlang-messages 或选择 json、bson、xml、msgpack...
    • 只是根据上面的好建议总结我的发现,我选择采用 dict 类型的 proplist 考虑到它提供了一种原生(元组列表)方法和模块允许以简单的方式通过键访问数据。 orddict 是更好的选择,但要从另一个项目构建它,键必须按升序定义,这与非 erlang 环境相比不太灵活。有关 dictorddict 的更多详细信息,请点击此处link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-02-02
    • 2018-03-27
    相关资源
    最近更新 更多