Erlangとiolist()
io:format/2みたいな書式指定の出力を、printfに対するsprintfのように、文字列を作るために使いたい! というときには io_lib:format/2が使えます。
16> io_lib:format("~s", ["ABCDE"]). ["ABCDE"] 17> io_lib:format("~10s", ["ABCDE"]). [[[32," ",32,32],65,66,67,68,69]] 18>
2個目は何が起きているの?何か悪いことした? と思うかもしれませんが(私もついさっきまではそう思っていました)、flattenするときちんと期待通りのものが出ていることが分かります。
18> lists:flatten(io_lib:format("~10s", ["ABCDE"])). " ABCDE" 19>
How to format a flat string with integers in it in erlang? - Stack Overflowによると、気にせずそのまま文字列として使っていいよ、と読めます。ただこの状態だと、string:len/1やlength/1で文字数を得ることができないよねえ...と思ったら、これもFAQに相当するもののようで、Erlang io:format to stringによると、iolist_size/1 が使えるようです。
19> L = io_lib:format("~10s", ["ABCDE"]). [[[32," ",32,32],65,66,67,68,69]] 20> length(L). 1 21> string:len(L). 1 22> iolist_size(L). 10 23>
めでたしめでたし...なのでしょうか? なんとなく取った先からlists:flatten/1したいという欲求に抗えない気持です。
なお、iolist_size/1 にただの文字列(string())を与えても問題ないようです。
23> iolist_size("ABCDE"). 5 24>
まだまだ分からないことがたくさんですね。という感想は、そんなことも知らなかったのか、という指摘への予防線としては何の威力もありませんね。