文書の出典
- 出典
- Lua 5.5.1 Documentation
- 上流バージョン
- Lua 5.5.1
- 文書状態
- 翻訳
2 – 基本概念
この節では、言語の基本概念について説明する。
2.1 – 値と型
Luaは動的型付け言語である。これは、変数には型がなく、値だけに型があることを意味する。この言語には型定義がない。すべての値が自身の型を持つ。
Luaのすべての値は第一級の値である。すなわち、すべての値を変数へ格納し、別の関数へ引数として渡し、結果として返すことができる。
Luaには、nil、boolean、number、string、function、userdata、thread、tableという8つの基本型がある。nil型が持つ値はnilだけであり、その主な性質は他のどの値とも異なることである。多くの場合、有用な値が存在しないことを表す。boolean型はfalseとtrueという2つの値を持つ。nilとfalseはいずれも条件を偽にし、まとめて偽値と呼ばれる。その他の値はすべて条件を真にする。falseはその名前にもかかわらず、nilの代わりとして頻繁に使用される。重要な違いは、falseがテーブル内で通常の値として動作する一方、テーブル内のnilはキーが存在しないことを表す点である。
number型は、integerとfloatという2つのサブタイプを使い、整数と実数(浮動小数点数)の両方を表す。標準Luaは64ビット整数と倍精度(64ビット)浮動小数点数を使用するが、32ビット整数や単精度(32ビット)浮動小数点数を使用するようLuaをコンパイルすることもできる。整数と浮動小数点数の両方を32ビットにするオプションは、小型機器や組み込みシステムに特に適している。(luaconf.hファイルのマクロLUA_32BITSを参照。)
特に断りがない限り、整数値の操作で発生するオーバーフローは、通常の2の補数算術規則に従ってラップアラウンドする。(言い換えると、実際の結果は、整数型のビット数をnとしたとき、数学的な結果と*2n*を法として合同になる、表現可能で一意の整数である。)
Luaには各サブタイプをいつ使用するかについて明示的な規則がある一方、必要に応じてサブタイプ間を自動的に変換する(§3.4.3を参照)。したがって、プログラマーは整数と浮動小数点数の違いをほぼ無視することも、各数値の表現を完全に制御することも選べる。
string型は、変更不可能なバイト列を表す。Luaは8ビットクリーンであり、文字列には埋め込まれたゼロ(‘\0’)を含む任意の8ビット値を格納できる。また、Luaは特定の文字エンコーディングに依存せず、文字列の内容について何も仮定しない。Luaの文字列長はLua整数に収まらなければならず、文字列と小さなヘッダーを合わせた大きさはsize_tに収まらなければならない。
Luaは、Luaで書かれた関数とCで書かれた関数の両方を呼び出し、操作できる(§3.4.10を参照)。いずれもfunction型で表される。
userdata型は、任意のCデータをLua変数へ格納できるようにするために用意されている。ユーザーデータ値は、未加工のメモリブロックを表す。ユーザーデータには2種類ある。フルユーザーデータはLuaが管理するメモリブロックを持つオブジェクトであり、ライトユーザーデータは単なるCポインター値である。代入と同一性の検査を除き、Luaにはユーザーデータに対する定義済みの操作はない。プログラマーはメタテーブルを使用して、フルユーザーデータ値に対する操作を定義できる(§2.4を参照)。ユーザーデータ値はLua内では作成も変更もできず、C APIを介した場合にだけ可能である。これにより、ホストプログラムとCライブラリが所有するデータの完全性が保証される。
thread型は独立した実行スレッドを表し、コルーチンの実装に使用される(§2.6を参照)。Luaスレッドはオペレーティングシステムのスレッドとは関係がない。Luaは、スレッドをネイティブにサポートしないものも含め、すべてのシステムでコルーチンをサポートする。
table型は連想配列、すなわち数値だけでなく、nilとNaNを除く任意のLua値をインデックスにできる配列を実装する。(Not a NumberはIEEE 754規格で使用される特殊な浮動小数点値であり、0/0などの未定義な数値結果を表す。)テーブルは異種混在にでき、nilを除くすべての型の値を格納できる。値nilに関連付けられたキーは、テーブルの一部とはみなされない。逆に、テーブルの一部でないキーには値nilが関連付けられている。
テーブルはLuaにおける唯一のデータ構造化機構であり、通常の配列、リスト、シンボルテーブル、集合、レコード、グラフ、木などを表すために使用できる。レコードを表す場合、Luaはフィールド名をインデックスとして使用する。この言語は、a["name"]の構文糖としてa.nameを提供し、この表現をサポートする。Luaには、テーブルを作成する便利な方法がいくつかある(§3.4.9を参照)。
インデックスと同様に、テーブルフィールドの値も任意の型にできる。特に、関数は第一級の値であるため、テーブルフィールドに関数を格納できる。したがって、テーブルはメソッドも保持できる(§3.4.11を参照)。
テーブルのインデックス指定は、言語における生の等価性の定義に従う。式a[i]とa[j]が同じテーブル要素を表すのは、iとjが生の意味で等しい(すなわちメタメソッドを使わずに等しい)場合、かつその場合に限る。特に、整数値を持つ浮動小数点数は、対応する整数と等しい(例:1.0 == 1)。曖昧さを避けるため、キーとして使われる浮動小数点数が整数と等しい場合、その整数へ変換される。たとえばa[2.0] = trueと書くと、実際にテーブルへ挿入されるキーは整数2となる。
テーブル、関数、スレッド、および(フル)ユーザーデータ値はオブジェクトである。変数はこれらの値を実際に格納するのではなく、それらへの参照だけを格納する。代入、引数渡し、関数からの戻りでは常にこのような値への参照が操作され、これらの操作はいかなる種類のコピーも伴わない。