English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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、例えば値が割り当てられていない変数を印刷すると、nil 値が出力されます:

> print(type(a))
nil
>

グローバル変数やテーブルには nil には "削除" 機能もあります。グローバル変数やテーブルの変数に 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(偽),Lua は false と nil を false として、他のすべてを true としてみなします、数字 0 も true です:

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("少なくとも一つが 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 はデフォルトで一種類の 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 string"1"
string2 = 'this is string'2'

また、 2 個の角括弧 "[[]]" で "一塊"の文字列を表します。

オンラインサンプル

html = [[
<html>
<head></head>
<body>
    <a href="http://ja.oldtoolbag.com/">基本チュートリアルサイト</a>
</body>
</html>
]]
print(html)
以下のコードの実行結果は:
<html>
<head></head>
<body>
    <a href="http://ja.oldtoolbag.com/">基本チュートリアルサイト</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: 文字列値に対して算術演算を試みました
stack traceback:
        stdin:1: in main chunk
        [C]: in ?
>

上記のコードでは "error" + 1エラーが発生しました、文字列結合には .. が使用されています、例えば:

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

文字列の長さを計算するために#を使用します。文字列の前に置きます。以下の例を参照してください:

> len = "ja.oldtoolbag.com"
> print(#len)
14
> print(#"ja.oldtoolbag.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

他の言語の配列と異なり、Luaでは配列の初期インデックスは0ではありません。テーブルのデフォルトの初期インデックスは一般的に 1 開始。

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

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

$ lua table_test2.lua 
キー    1
キー    2
キー    3
キー    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)」と見なされます-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

関数は匿名関数(匿名関数)としてパラメータを通じて渡すことができます:

-- 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)とほぼ同じであり、独自のスタック、ローカル変数、およびコマンドポインタを持っており、他のコルーチンとともにグローバル変数やほとんどすべてを共有できます。

スレッドとコルーチンの違い:スレッドは同時に複数で実行可能であり、コルーチンは任意の瞬間にただ一つで実行可能であり、実行中のコルーチンは suspend(一時停止)されるまで停止しません。

userdata(カスタムタイプ)

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