Lua データ型
Lua は動的型付け言語であり、変数に型定義は不要で、変数に値を代入するだけです。値は変数に格納でき、パラメータとして渡したり、結果として返したりできます。
Lua には8つの基本型があります:nil、boolean、number、string、userdata、function、thread、table。
| データ型 | 説明 |
|---|---|
| nil | これは最も単純で、値 nil だけがこの型に属します。無効な値を表します(条件式では false と同等です)。 |
| boolean | false と true の2つの値があります。 |
| number | 倍精度型の実浮動小数点数を表します。 |
| string | 文字列はダブルクォートまたはシングルクォートのペアで表します。 |
| function | C または Lua で書かれた関数。 |
| userdata | 変数に格納された任意のCデータ構造を表します。 |
| thread | 実行される独立したスレッドを表し、コルーチンを実行するために使われます。 |
| table | Lua のテーブル(table)は実際には「連想配列」(associative arrays)であり、配列のインデックスには数値、文字列、またはテーブル型を使用できます。Lua では、テーブルは「コンストラクタ式」によって作成され、最も単純なコンストラクタ式は {} で、空のテーブルを作成します。 |
type 関数を使用して、指定した変数または値の型をテストできます:
例
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 値を代入すると、それらを削除するのと同じです。次のコードを実行すると分かります:
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 を比較する場合はダブルクォートを付ける必要があります":
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(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.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>
<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 はその数字文字列を数値に変換しようとします:
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
>
# を使って文字列の長さを計算します。文字列の前に置きます。次の例のとおりです:
例
> print(#len)
14
> print(#"www.example.com")
14
>
table(テーブル)
Lua では、テーブルは「コンストラクタ式」によって作成されます。最も単純なコンストラクタ式は {} で、空のテーブルを作成します。また、テーブルにデータを追加して、直接初期化することもできます:
例
local tbl1 = {}
-- テーブルを直接初期化
local tbl2 = {"apple", "pear", "orange", "grape"}
Lua のテーブル(table)は実際には「連想配列」(associative arrays)であり、配列のインデックスには数値または文字列を使用できます。
例
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 から始まります。
例
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 です。
例
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 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 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 変数に格納して呼び出すことができます。
その他の拡張