2

以下により、タプルまたはオブジェクトを 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,["前の構文エラー: ",[]]}}

それを達成する方法についての考えは?ありがとう。

4

1 に答える 1

5

最初に、レコードはデータ型として存在しないことを覚えておく必要があります。内部的にレコードは、最初の要素がレコードの名前であるタプルです。したがって、レコード定義では次のようになります。

-record(myrecord,{firstname,lastname,age}).

でレコードを作成する

#myrecord{firstname='john',lastname='doe',age=22}

タプルになります

{myrecord,john,doe,22}

実際のデータのみが含まれています。これがレコードの定義方法です。ここを参照してください。

2 番目のポイントは、レコードは純粋にコンパイル時の構文構造であり、コンパイラがタプル操作で変換するということです。したがって、レコードの定義は、データのようにどこにも存在しません。コンパイラだけがレコード定義を認識します。したがって、レコードを印刷すると、表示されるのはタプルだけです。ただし、シェル内でレコードを定義できるため、シェルでレコード構文を使用できます。シェルのドキュメントを参照してください。

したがって、この意味で、レコードをその文字列表現との間で実際に変換することはできません。文字列を解析できますが、これは目的ではない抽象構文のみを返します。これらは式であるため、文字列を a で終了し、.を使用する必要がありますerl_parse:exprs/1

お役に立てれば。あなたは何をしようとしているのですか?というか、なぜそうしようとしているのですか?

于 2013-02-17T21:23:39.080 に答える