Lua データ型

Lua は動的型付け言語であり、変数に型定義は不要で、変数に値を代入するだけです。値は変数に格納でき、パラメータとして渡したり、結果として返したりできます。

Lua には8つの基本型があります:nil、boolean、number、string、userdata、function、thread、table。

データ型説明
nilこれは最も単純で、値 nil だけがこの型に属します。無効な値を表します(条件式では false と同等です)。
booleanfalse と true の2つの値があります。
number倍精度型の実浮動小数点数を表します。
string文字列はダブルクォートまたはシングルクォートのペアで表します。
functionC または Lua で書かれた関数。
userdata変数に格納された任意のCデータ構造を表します。
thread実行される独立したスレッドを表し、コルーチンを実行するために使われます。
tableLua のテーブル(table)は実際には「連想配列」(associative arrays)であり、配列のインデックスには数値、文字列、またはテーブル型を使用できます。Lua では、テーブルは「コンストラクタ式」によって作成され、最も単純なコンストラクタ式は {} で、空のテーブルを作成します。

type 関数を使用して、指定した変数または値の型をテストできます:

例

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil
print(type(type(X)))            --> string

nil(空)

nil 型は有効な値を持たないことを表し、値は -- nil だけです。例えば、代入されていない変数を print すると、nil 値が出力されます:

> print(type(a))
nil
>

グローバル変数とテーブルに対して、nil にはもう1つ「削除」の役割があります。グローバル変数またはテーブル内の変数に nil 値を代入すると、それらを削除するのと同じです。次のコードを実行すると分かります:

tab1 = { key1 = "val1", key2 = "val2", "val3" }
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end
 
tab1.key1 = nil
for k, v in pairs(tab1) do
    print(k .. " - " .. v)
end

nil を比較する場合はダブルクォートを付ける必要があります":

> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>

type(X)==nil結果はfalseその理由は、type(X) が実際に返すのは"nil"文字列、つまり string 型であるためです:

type(type(X))==string

boolean(ブール)

boolean 型には true(真)と false(偽)の2つの値しかありません。Lua は false と nil を false と見なし、その他はすべて true です。数字の 0 も true です:

例

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("少なくとも1つは true")
else
    print("false と nil はどちらも false")
end

if 0 then
    print("数字の 0 は true")
else
    print("数字の 0 は false")
end

上記コードの実行結果は次のとおりです:

$ lua test.lua 
boolean
boolean
nil
false 和 nil 都为 false
数字 0 是 true

number(数値)

Lua ではデフォルトで1つの number 型 -- double(倍精度)型のみです(デフォルト型は luaconf.h 内の定義で変更できます)。以下の書き方はすべて number 型と見なされます:

例

print(type(2))
print(type(2.2))
print(type(0.2))
print(type(2e+1))
print(type(0.2e-1))
print(type(7.8263692594256e-06))

上記コードの実行結果:

number
number
number
number
number
number

string(文字列)

文字列はダブルクォートまたはシングルクォートのペアで表します。

string1 = "this is string1"
string2 = 'this is string2'

また、2つの角括弧 "[[]]" を使って「ブロック」の文字列を表すこともできます。

例

html = [[
<html>
<head></head>
<body>
<a href="http://www.example.com/">サンプル</a>
</body>
</html>
]]

print(html)

以下のコードの実行結果は:

<html>
<head></head>
<body>
    <a href="../index.html">サンプル</a>
</body>
</html>

数字文字列に対して算術演算を行うとき、Lua はその数字文字列を数値に変換しようとします:

> print("2" + 6)
8.0
> print("2" + "6")
8.0
> print("2 + 6")
2 + 6
> print("-2e2" * "6")
-1200.0
> print("error" + 1)
stdin:1: attempt to perform arithmetic on a string value
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

上記コードでは "error" + 1 の実行でエラーが発生しました。文字列の連結には .. を使用します。例:

> print("a" .. 'b')
ab
> print(157 .. 428)
157428
> 

# を使って文字列の長さを計算します。文字列の前に置きます。次の例のとおりです:

例

> len = "www.example.com"
> print(#len)
14
> print(#"www.example.com")
14
>

table(テーブル)

Lua では、テーブルは「コンストラクタ式」によって作成されます。最も単純なコンストラクタ式は {} で、空のテーブルを作成します。また、テーブルにデータを追加して、直接初期化することもできます:

例

-- 空のテーブルを作成
local tbl1 = {}
 
-- テーブルを直接初期化
local tbl2 = {"apple", "pear", "orange", "grape"}

Lua のテーブル(table)は実際には「連想配列」(associative arrays)であり、配列のインデックスには数値または文字列を使用できます。

例

-- table_test.lua スクリプトファイル
a = {}
a["key"] = "value"
key = 10
a[key] = 22
a[key] = a[key] + 11
for k, v in pairs(a) do
    print(k .. " : " .. v)
end

スクリプトの実行結果は:

$ lua table_test.lua 
key : value
10 : 33

他の言語の配列が 0 を配列の最初のインデックスとするのとは異なり、Lua のテーブルのデフォルトのインデックスは通常 1 から始まります。

例

-- table_test2.lua スクリプトファイル
local tbl = {"apple", "pear", "orange", "grape"}
for key, val in pairs(tbl) do
    print("Key", key)
end

スクリプトの実行結果は:

$ lua table_test2.lua 
Key    1
Key    2
Key    3
Key    4

テーブルは長さが固定されず、新しいデータが追加されるとテーブルの長さは自動的に増えます。初期化されていないテーブルの要素はすべて nil です。

例

-- table_test3.lua スクリプトファイル
a3 = {}
for i = 1, 10 do
    a3[i] = i
end
a3["key"] = "val"
print(a3["key"])
print(a3["none"])

スクリプトの実行結果は:

$ lua table_test3.lua 
val
nil

function(関数)

Lua では、関数は「第一級値(First-Class Value)」と見なされます。関数は変数に格納できます:

例

-- function_test.lua スクリプトファイル
function factorial1(n)
    if n == 0 then
        return 1
    else
        return n * factorial1(n - 1)
    end
end
print(factorial1(5))
factorial2 = factorial1
print(factorial2(5))

スクリプトの実行結果は:

$ lua function_test.lua 
120
120

関数は無名関数(anonymous function)としてパラメータで渡すこともできます:

例

-- function_test2.lua スクリプトファイル
function testFun(tab,fun)
        for k ,v in pairs(tab) do
                print(fun(k,v));
        end
end


tab={key1="val1",key2="val2"};
testFun(tab,
function(key,val)--無名関数
        return key.."="..val;
end
);

スクリプトの実行結果は:

$ lua function_test2.lua 
key1=val1
key2=val2

thread(スレッド)

Lua で最も主要なスレッドはコルーチン(coroutine)です。スレッド(thread)とほぼ同じで、独自のスタック、ローカル変数、命令ポインタを持ち、他のコルーチンとグローバル変数やその他の大半のものを共有できます。

スレッドとコルーチンの違い:スレッドは複数を同時に実行できますが、コルーチンは任意の時点で1つしか実行できません。また、実行中のコルーチンはサスペンド(suspend)されたときだけ一時停止します。


userdata(ユーザー定義型)

userdata はユーザー定義データで、アプリケーションまたは C/C++ 言語ライブラリによって作成された型を表すために使用されます。任意の C/C++ データ型のデータ(通常は struct とポインタ)を Lua 変数に格納して呼び出すことができます。

その他の拡張