2011-06-28 8 views
9

は、私はそれで、整数と文字列をフォーマットしたいと私は結果が平らにすることにしたいです。しかし、私はこれを得る:? Erlangで

io_lib:format("sdfsdf ~B", [12312]).     
[115,100,102,115,100,102,32,"12312"] 

私は以下のコードを使用して希望の結果を得ることができますが、実際にはエレガントではありません。

lists:flatten(io_lib:format("sdfsdf ~B", [12312])). 
"sdfsdf 12312" 

整形文字列に整数が含まれているため、フラットになっていますか?理想的には、1つの関数だけを使用しますか?

答えて

6

は、あなたはあなたの例でやったようlists:flatten/1を使用してリストを平ら。

あなたがバイナリを受け入れることができれば、list_to_binary/1は非常に効率的である:あなたが最初の場所でフラットなリストを必要とする理由しかし、疑問

1> list_to_binary(io_lib:format("sdfsdf ~B", [12312])). 
<<"sdfsdf 12312">> 

。それが化粧品だけなら、あなたはそれを必要としません。 io:format/1,2,3および他のほとんどのポート機能(gen_tcpなど)は、いわゆる深いIOリスト(文字とバイナリとネストされたリスト)を受け入れる:

2> io:format([115,100,102,115,100,102,32,"12312"]). 
sdfsdf 12312ok 
2

io_lib効率の理由があります:フォーマットが深いのリストを返しますが。基本的には、リストへの呼び出しを保存します。

リストを平坦化する理由自問してみてください。リストを印刷したり、ポートに送信したり、ファイルに書き込んだりする場合は、すべての操作がディープ・リストを処理します。

あなたが実際にいくつかの理由のために平らにリストが必要な場合は、ちょうどそれを平ら。あるいは、自分が重要だと思うならば、平坦なリストを返す独自のmy_io_lib:形式を作成することもできます。

(あなただけ〜Sを使用して文字列を印刷、またはuser_defaultという名前のerlangモジュールにフラットナーを作成するのいずれか、その後の理由をデバッグするためのリストを平らにしたい場合は、このような何か:。

-module(user_default). 
-compile(export_all). 
%% either this: 
fl(String) -> 
    lists:flatten(String). 
%% or this: 
pp(String) -> 
    io:format("~s~n", [String]). 

次に、あなたがすることができます(限りuser_default.beamはもちろん、あなたのパスにあるよう)ErlangのシェルでFL/1とプリント/ 1を使用します。)