Luaのデータ型


Lua は動的に型指定される言語です。変数に型を指定する必要はなく、変数に値を割り当てるだけで済みます。 値は変数に保存したり、引数として渡したり、結果として返すことができます。

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

nilこれは最も単純な値 nil のみがこのクラスに属し、無効な値 (条件式の false に相当) を表します。 booleanには、false と true の 2 つの値が含まれます。 number倍精度型の実浮動小数点数を表しますstring文字列は二重引用符または一重引用符のペアで表されますfunctionCで書かれた関数またはLuauserdata は変数に格納された任意の C データ構造を表します thread コルーチンを実行するための独立した実行ラインを表します table Lua のテーブルは実際には「連想配列」です" (連想配列) の場合、配列のインデックスは数値または文字列になります。 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 型は、有効な値を持たない型を表します。値は 1 つだけ、nil だけです。たとえば、代入なしで変数を出力すると、 nil 値が出力されます:

> print(type(a))
nil
>

グローバル変数とテーブルの場合、 nil には「削除」関数もあります。グローバル変数またはテーブル table 内の変数に 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

boolean (ブール値)

boolean 型には true (true) と false (false) の 2 つの値しかありません。Lua は false と nil を「false」として扱います。 is "true" ":

print(type(true))
print(type(false))
print(type(nil))
 
if false or nil then
    print("至少有一个是 true")
else
    print("false 和 nil 都为 false!")
end

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

$ lua test.lua 
boolean
boolean
nil
false 和 nil 都为 false!

number (数値)

Lua のデフォルトの数値型は double (倍精度) 型の 1 つだけです (デフォルトの型はluaconf.h) で定義されているように変更できます。次のようにいくつかの書き込みメソッドが数値型とみなされます:

インスタンス

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.w3cschool.cc/">w3cschoolphp中文网</a>
</body>
</html>
]]
print(html)

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

<html>
<head></head>
<body>
    <a href="http://www.w3cschool.cc/">w3cschoolphp中文网</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.w3cschool.cc"
> print(#len)
16
> print(#"www.w3cschool.cc")
16
>

table (table )

Lua では、テーブルの作成は「構築式」によって行われます。最も単純な構築式は、空のテーブルを作成するために使用されます。テーブルにデータを追加してテーブルを直接初期化することもできます:

-- 创建一个空的 table
local tbl1 = {}
 
-- 直接初始表
local tbl2 = {"apple", "pear", "orange", "grape"}

Lua のテーブルは実際には「連想配列」であり、配列のインデックスは数値または文字列にすることができます。

-- 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では関数は「第一級の値」とみなされ、関数は変数に格納できます:

-- 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 anonymous(tab, fun)
    for k, v in pairs(tab) do
        print(fun(k, v))
    end
end
tab = { key1 = "val1", key2 = "val2" }
anonymous(tab, function(key, val)
    return key .. " = " .. val
end)

スクリプトの実行結果は次のとおりです:

$ lua function_test2.lua 
key1 = val1
key2 = val2

thread (スレッド)

Lua では、メインスレッドは Coroutine です。これはスレッドに似ており、独自の独立したスタック、ローカル変数、命令ポインターを持ち、グローバル変数やその他のほとんどのものを他のコルーチンと共有できます。

スレッドとコルーチンの違い: スレッドは同時に複数回実行できますが、コルーチンはいつでも 1 つだけ実行でき、実行中のコルーチンは一時停止された場合にのみ一時停止されます。


userdata (カスタム型)

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

データ型説明