English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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("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(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
> type(X) nil > type(X) == nil false > type(X) == "nil" true >
type(X) == nil の結果は false の理由は type(X) は実際には返される "nil" 文字列であり、string 型です:
type(type(X)) == string
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
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
文字列は二重引用符または単一引用符で表されます。
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 >
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
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
Luaでは、主なスレッドはコルーチン(coroutine)です。スレッド(thread)とほぼ同じであり、独自のスタック、ローカル変数、およびコマンドポインタを持っており、他のコルーチンとともにグローバル変数やほとんどすべてを共有できます。
スレッドとコルーチンの違い:スレッドは同時に複数で実行可能であり、コルーチンは任意の瞬間にただ一つで実行可能であり、実行中のコルーチンは suspend(一時停止)されるまで停止しません。
userdata はユーザー定義データであり、アプリケーションや C/C++ 言語のライブラリで作成されたタイプであり、任意の C/C++ の任意データ型のデータ(通常は struct と ポインタ)を Lua 変数に格納して呼び出す。