文字列への強制変換

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(和訳版の場合) に紹介されていた技法です。
普通に便利なので、これから使っていこうかと。