Luaのデータ型

## 値と型

Luaは*動的な型の言語*である。つまり、変数は型を持たず、値が型を持つ。型定義の構文はない。すべての値は自分自身で型を保持している。Luaのすべての値は*ファーストクラスの値*である。つまり、いかなる値も変数に格納でき、他の関数に引数で渡すことができ、戻り値として返すことができる。

Luaには8つの基本型がある・・・が、Scribuntoではその内の2つがオミットされて6つしか使えない。`type()`関数が現在の値の型を返す。

`tostring()`関数は値を文字列へ変換します。`tonumber()`関数は可能なら値を数値へ変換し、変換できないならnilを返します。その他のデータ型へ変換する明示的な関数はありません。

数値は、文字列が期待される場所では自動的に文字列へ変換されます。たとえば文字列連結演算子で。文字列が算術演算子に使用される場合、`tonumber()`によって数値へ変換されます。真偽値が期待される場所では、nil以外の全ての値はtrueとして扱われます。

### nil

"Nil"はそのまんま`nil`値の型である。その主な性質は他のいかなる値とも異なることであり、通常、意味のある値がないことを表す。

Stringに変換すると、それは数字ではなく"nil"の文字を返す。booleanでは`false`を返す。

### boolean

booleanは`false`と`true`の値を持つ型である。`nil`と`false`は共に条件判断で偽となり、他の値は真となる。

Stringに変換すると、それは数字ではなく"false"か"true"の文字を返す。他の言語で`false`を返す空文字列と0もLuaでは`true`を返す。

### string

Luaのstringsは8bit形式の文字列の型である。詳しい事はこちらへどうぞ。

### number

Luaのnumberは実数(double)を表現する。整数で-9007199254740992から9007199254740992までを表現できるが、それを超えるとエラーになってしまう。

数値は小数の区切りとして「`.`」を使用して `123456.78` のように記述します。指数表記を使用して `1.23e-10`、`123.45e20`あるいは`1.23E5`のように表現することも出来ます。整数は`0x`を使用した16進数記法で、`0x3A`のようにも記述できます。

非数(NaN)および正負の無限大は正しく保持し扱うことができますが、Luaはこれらに対応するリテラルを提供していません。定数`math.huge`は正の無限大であり、`1/0`のような除算も同様です。また、手っ取り早く非数を生成する方法として`0/0`が使われる場合があります。

Note booleanでは他の言語がfalseを返す0もtrueを返す。文字列へ変換される場合、有限の数値は小数で、可能なら指数表記で表現される。非数は "nan" または "-nan"、無限大は "inf" または "-inf" となる。

### table

Luaのtableは連想配列であり、Luaの唯一のデータ構造であり、 普通の配列の他、記号表、集合、レコード、グラフ、ツリーなどを表現するために使われる。

「LuaのTableは、Array型＋Hash型という混合型なんだよ！！！」
↑きもちわるいです・・・
Tables are created using curly braces. The empty table is `{}`. To populate fields on creation, a comma- and/or semicolon-separated list of field specifiers may be included in the braces. These take any of several forms:

* `[expression1] = expression2` uses the (first) value of *expression1* as the key and the (first) value of *expression2* as the value.
* `name = expression` is equivalent to `["name"] = expression`
* `expression` is roughly equivalent to `[*i*] = expression`, where *i* is an integer starting at 1 and incrementing with each field specification of this form. If this is the last field specifier and the expression has multiple values, all values are used; otherwise only the first is kept.

The fields in a table are accessed using bracket notation, e.g. `table[key]`. String keys that are also valid names may also be accessed using dot notation, e.g. `table.key` is equivalent to `table['key']`. Calling a function that is a value in the table may use colon notation, e.g. `table:func( ... )`, which is equivalent to `table['func']( table, ... )`.

A *sequence* is a table with non-nil values for all positive integers from 1 to N and no value (nil) for all positive integers greater than N. Many Lua functions operate only on sequences, and ignore non-positive-integer keys.

Unlike PHP or JavaScript, however, any value except nil and NaN may be used as a key and no type conversion is performed. These are all valid and distinct:

```
-- テーブル
t = {}
t["foo"] = "foo"
t.bar = "bar"
t[1] = "一"
t[2] = "二"
t[3] = "三"
t[12] = "数値12"
t["12"] = "文字列「12」"
t[true] = "真値true"
t[tonumber] = "関数もキーとして使えます"
t[t] = "テーブルは自分自身をキーとして使えます"

-- 上のテーブルとおおよそ同等なテーブル
t2 = {
    foo = "foo",
    bar = "bar",
    "一",
    "二",
    [12] = "数値12",
    ["12"] = "文字列「12」",
    "三",
    [true] = "真値true",
    [tonumber] = "関数もキーとして使えます",
}
t2[t2] = "テーブルは自分自身をキーとして使えます"

```

同様に、nil以外のどんな値でもテーブルの値として入れることができます。nilを表に入れるというのは、対応するキーを削除するのと同じことです。また、それまでに何も値を設定されていないキーの値を参照するとnilが返されます。

Lua言語ではテーブルは暗黙に複製がつくられることはありません。例えばある関数が引数としてテーブルデータを受け取って、その関数がそのテーブルデータに対して何らかの変更を加えるとすれば、その変更はそのまま関数を呼び出し側からも見えてしまうということです。

テーブルデータを文字列に変換すると既定では "table" という文字列になるだけですが、\_\_tostringメソッドをオーバラーライド（上書き）することで、この結果を変えることができます。

中身が空のテーブルを含めてすべてのテーブルデータはbooleanとしてはtrueとして扱われます。

全角の生キーは控えましょう。
引用元：Qlitaの記事

```
a = {ァ = @}  -- 0x83 0x40 (@)
--a = {ア = A} -- 0x83 0x41 (A)
--a = {セ = Z} -- 0x83 0x5A (Z)
a = {ゼ = [}  -- 0x83 0x5B ([)
a = {ソ = \}  -- 0x83 0x5C (\)
a = {ゾ = ]}  -- 0x83 0x5D (])
a = {タ = ^}  -- 0x83 0x5E (^)
--a = {ダ = \_} -- 0x83 0x5F (\_)
a = {チ = `}  -- 0x83 0x60 (`)
--a = {ヂ = a} -- 0x83 0x61 (a)
--a = {ホ = z} -- 0x83 0x7A (z)
a = {ボ = {}  -- 0x83 0x7B ({)
a = {ポ = |}  -- 0x83 0x7C (|)
a = {マ = }}  -- 0x83 0x7D (})
a = {ミ = ~}  -- 0x83 0x7E (~)
--a = {ム = 0} -- 0x83 0x80 (以下ASCII外なので全部OK)
--a = {メ = 0} -- 0x83 0x81
--a = {ぁ = 0} -- 0x82 0x9F
--a = {あ = 0} -- 0x82 0xA0
--a = {◯ = 0} -- 0x81 0xFC (終わり)

```

### function

Functions in Lua are first-class values: they may be created anonymously, passed as arguments, assigned to variables, and so on.

Functions are created using the `function` keyword, and called using parentheses. Syntactic sugar is available for named functions, local functions, and functions that act like member functions to a table. See Function declarations and Function calls below for details.

Lua functions are closures, meaning that they maintain a reference to the scope in which they are declared and can access and manipulate variables in that scope.

Like tables, if a function is assigned to a different variable or passed as an argument to another function, it is still the same underlying "function object" that will be called.

When converted to a string, the result is "function".

### Wikiaでは使われない型

*ユーザーデータ*は任意のCのデータをLuaの変数に格納するために用意された。この型は生のメモリブロックに相当し、代入と等価比較を除いて、Luaでは演算が定義されていない。しかしながら、*メタテーブル*を用いることで、プログラマはユーザーデータに対する演算を定義することができる。ユーザーデータはLua内で作ったり変更することはできず、CのAPIを通してのみ可能である。これは完全にホストプログラムに所有されたデータであることを保証する。

Scribuntoではセキュリティの問題で使えない。
*スレッド* は実行されているそれぞれのスレッドを表現し、コルーチンを実装するために使われる。 LuaのスレッドとOSのスレッドを混同しないように。 Luaはスレッドをサポートしないシステム上でもコルーチンをサポートする。

Scribuntoではマイナーな事もあり使えない。