Lua:テーブルから文字列に変換

間違ってデータを消去する前に、WEBに載せておきます。

Luaでテーブルから文字列へ変換する関数です。テーブルの値は、文字列、数値、論理、テーブルを扱うことができます。それ以外の値がテーブルに入っていた場合、エラーを発生させるようにしました。

function tableToString( t )
	if t[1] then
		return arryaToString( t )
	else
		return dictionaryToString( t )
	end
end

function arryaToString( t )
	local s = { "{" }
	local i = 2
	for j = 1, #t do
		s[i] = valueToString( t[j] )
		s[i+1] = ","
		i = i + 2
	end
	s[i-1] = "}"
	return table.concat( s )
end

function dictionaryToString( t )
	local s = { "{" }
	local i = 2
	for key, val in pairs( t ) do
		s[i] = key
		s[i+1] = "="
		s[i+2] = valueToString( val )
		s[i+3] = ","
		i = i + 4
	end
	s[i-1] = "}"
	return table.concat( s )
end

function valueToString( val )
	if type( val ) == "string" then
		return [["]] .. val .. [["]]
	elseif type( val ) == "table" then
		return tableToString( val )
	elseif type( val ) == "number" or type(val) == "boolean" then
		return tostring( val )
	else
		error( "the table contains thread, function or userdata value." )
	end
end

文字列を結合する時に、..演算子ではなくわざわざtable.concatを使っているのは、こっちのが早いという噂を耳にしたからです。確認はしていませんが。

あと、関数名のセンスがまだLua的じゃなさそうなので、そのへんをどうにかしたいですね。

既知のバグとして、1つのテーブルを配列と連想配列両方にして使ってしまっていると、配列の方しか文字列になりません。普通はそんな使い方しないと思うので、手抜きしてます。

コメント投稿