Lua では数値と文字列は相互に変換可能です。
http://ideone.com/zvnjL
print( math.sin("1.0") ) -- OK print( string.byte(0) ) -- OK. "0" の文字コード(ASCIIの場合 48 )
これは通常、細かいことを気にしなくていいので割と便利なわけですが、
type 関数を使った場合や == で比較する場合などは、思わぬバグの元になったりします。
で、そのような場合に、文字列から数値、数値から文字列への強制型変換があると良いのですが、
文字列から数値への変換は assert( tonumber(x) ) と書けばいいのに対し、
数値から文字列への変換には、ちょうどいい関数がありません。
一応、あらゆる型から文字列への変換をする、 tostring 関数というのはあるのですが、
これは数値以外も文字列に変換する上、その場合の変換結果は割と不自然("table: 0x1234"とか)です。
かといって、不自然な変換を避けるため、条件分岐を使って
function str(x) local tp = type(x) if tp == "number" then return tostring(x) elseif tp == "string" then return x else error("bad argument: number or string required") end end local s = str(10) -- "10" local s = str({}) -- error!
とか書くのでは、少しばかり大げさ過ぎます。
さて、どうにかならないものか…。
それ .. 演算子でできるよ!
function str(x) return x .. "" end local s = str(10) -- "10" local s = str({}) -- error!
何のことはない、公式本 "Programming in Lua" の p.32(和訳版の場合) に紹介されていた技法です。
普通に便利なので、これから使っていこうかと。