この最初の版は、Lua 5.0 のために書かれました。そのほとんどは後のバージョンでも関連性がありますが、いくつかの違いがあります。
第 4 版は Lua 5.3 を対象としており、Amazon や他の書店で購入できます。
本の購入により、Lua プロジェクトの支援にも貢献できます。


2.4 – 文字列

文字列は通常の文字を表す一連の文字です。Lua は 8 ビットクリーンであるため、文字列にはゼロ埋め込み値を含む任意の数値の文字を含めることができます。これは、任意のバイナリデータを文字列に格納できることを意味します。Lua の文字列は不変値です。C で文字列内の文字を変更することはできません。代わりに、次の例のように、必要な変更を加えた新しい文字列を作成します。

    a = "one string"
    b = string.gsub(a, "one", "another")  -- change string parts
    print(a)       --> one string
    print(b)       --> another string

Lua の文字列は、他のすべての Lua オブジェクトと同様に、自動メモリ管理の対象です。つまり、文字列の割り当てや開放を心配する必要はありません。Lua はこれをすべて処理してくれます。文字列には、1 文字または 1 冊の書籍を含めることができます。Lua は長い文字列を非常に効率的に処理します。100K 文字または 1M 文字の文字列を操作するプログラムは、Lua では珍しいことではありません。

リテラル文字列を、単一引用符または二重引用符を一致させることで区切ることができます。

    a = "a line"
    b = 'another line'
スタイルの観点から、文字列自体に引用符が含まれない限り、プログラムでは常に同じ種類の引用符(単一または二重)を使用する必要があります。その場合は、他の引用符を使用するか、それらの引用符をバックスラッシュでエスケープします。Lua の文字列には、次の C ライクなエスケープシーケンスを含めることができます。
\aベル
\bバックスペース
\f改ページ
\n改行
\r復帰
\t水平タブ
\v垂直タブ
\\バックスラッシュ
\"二重引用符
\'単一引用符
\[左角括弧
\]右角括弧

これらを使用する方法を次の例に示します。

    > print("one line\nnext line\n\"in quotes\", 'in quotes'")
    one line
    next line
    "in quotes", 'in quotes'
    > print('a backslash inside quotes: \'\\\'')
    a backslash inside quotes: '\'
    > print("a simpler way: '\\'")
    a simpler way: '\'

\ddd エスケープシーケンスを使用して、文字列内の文字を数値でも指定できます。ここで、ddd は最大 3 桁の 10 進数 桁のシーケンスです。多少複雑な例として、2 つのリテラル "alo\n123\""'\97lo\10\04923"' は、ASCII を使用するシステムでは同じ値になります。97 は a の ASCII コードで、10 は改行のコードで、49(例では \049 )は桁 1 のコードです。

リテラル文字列を、二重角括弧 [[...]] を一致させることで区切ることもできます。この括弧形式のリテラルは、複数の行にまたがって実行でき、ネストでき、エスケープシーケンスを解釈しません。さらに、この形式は文字列の最初の文字が改行の場合、その文字を無視します。この形式は、プログラム部分を含む文字列を書く場合に特に便利です。たとえば、

    page = [[
    <HTML>
    <HEAD>
    <TITLE>An HTML Page</TITLE>
    </HEAD>
    <BODY>
     <A HREF="https://lua.dokyumento.jp">Lua</A>
     [[a text between double brackets]]
    </BODY>
    </HTML>
    ]]
    
    write(page)

Lua は、実行時に数値と文字列を自動的に変換します。文字列に対して数値操作を適用すると、文字列が数値に変換されます。

    print("10" + 1)           --> 11
    print("10 + 1")           --> 10 + 1
    print("-5.3e-10"*"2")     --> -1.06e-09
    print("hello" + 1)        -- ERROR (cannot convert "hello")
Lua は、算術演算子だけでなく、数値を想定する他の場所でもそのような強制変換を適用します。逆に、文字列を想定する場所で数値が見つかった場合、Lua はその数値を文字列に変換します。
    print(10 .. 20)        --> 1020
(Lua では、.. は文字列連結演算子です。数値のすぐ後にこれを記述する場合は、スペースで区切る必要があります。そうしないと、Lua は最初のドットを小数点と認識します。)

こうした自動変換にもかかわらず、文字列と数字は異なるものです。 10 == "10" のような比較は常に偽になります。これは、10は数値で "10" は文字列であるためです。文字列を明示的に数値に変換する必要がある場合は、tonumber 関数を使用できます。この関数は、文字列が適切な数値を表さない場合はnilを返します

    line = io.read()     -- read a line
    n = tonumber(line)   -- try to convert it to a number
    if n == nil then
      error(line .. " is not a valid number")
    else
      print(n*2)
    end

数値を文字列に変換するには、tostring 関数を呼び出すか、数値を空の文字列と連結します

    print(tostring(10) == "10")   --> true
    print(10 .. "" == "10")       --> true
このような変換は常に有効です