Luaのデータ型の概要
nil、boolean、number、string、table、function、userdata型について学びます。
「Luaのデータ型の概要」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
Luaへようこそ
Luaは、ゲームエンジン、Webサーバー、組み込みシステムで使用される、軽量で高速、かつ組み込み可能なスクリプト言語です。実際のプログラムを書く前に、Luaがデータをどのように表現するかを理解する必要があります。
Luaには8つの基本型があります。nil、boolean、number、string、table、function、userdata、threadです。Luaのすべての値は、これらの型のいずれか1つに属します。
-- Check the type of any value with type()
print(type(42)) -- number
print(type("hello")) -- string
print(type(true)) -- boolean
print(type(nil)) -- nilnil:値の不在
nilは、何もないことや値がないことを表すLuaの仕組みです。この型の値はこれだけです。一度も代入されていない変数には、自動的にnilが入ります。
グローバル変数にnilを代入すると、実質的にその変数が削除されます。テーブルでは、キーにnilを設定すると、そのエントリ全体が削除されます。
-- Unassigned variables are nil
print(x) -- nil
x = 10
print(x) -- 10
x = nil
print(x) -- nil (variable is gone)boolean:trueとfalse
boolean型には、trueとfalseの2つの値しかありません。Luaの真偽値判定の規則は単純ですが重要です。偽と判定されるのはnilとfalseだけです。数値の0や空文字列""を含め、それ以外はすべて真と判定されます。
これは、0や""を偽と見なす多くの言語とは異なります。
-- Lua truthiness examples
if 0 then print("0 is truthy!") end -- prints!
if "" then print("empty str is truthy!") end -- prints!
if nil then print("nil") else print("nil is falsy") end
if false then print("false") else print("false is falsy") endnumber:整数と浮動小数点数
Lua 5.3以降のnumberには、integerとfloatという2つのサブタイプがあります。整数は正確な64ビット値で、浮動小数点数はIEEE 754倍精度です。Lua 5.1/5.2では、すべての数値が倍精度です。
math.type()関数を使うと、2つのサブタイプを区別できます。/による除算は常に浮動小数点数を返し、//(切り捨て除算)は、両方のオペランドが整数の場合に整数を返します。
print(type(10)) -- number
print(type(10.5)) -- number
print(math.type(10)) -- integer
print(math.type(10.5))-- float
print(10 / 3) -- 3.3333...
print(10 // 3) -- 3 (floor division)string:Luaのテキスト
Luaの文字列は、変更できないバイト列です。文字列はシングルクォート、ダブルクォート、または複数行の文字列に使える長いブラケット [[...]]で囲めます。長いブラケット文字列では、最初の改行は無視され、それ以外はすべてそのまま保持されます。
Luaの文字列はインターン化されるため、同一の文字列はメモリを共有します。長さ演算子#はバイト数を返します。
local s1 = 'single quotes'
local s2 = "double quotes"
local s3 = [[multi-line
long string]]
print(#s1) -- 13
print(type(s1)) -- string
print(s1 .. " works") -- concatenation with ..table:汎用コンテナ
table型はLua唯一の複合データ構造ですが、配列、辞書、オブジェクト、集合などを実装できるほど強力です。テーブルは連想配列であり、キーと値を対応付けます。キーには、nilでもNaNでもない任意の値を使用できます。
テーブルは中括弧{}で作成します。配列形式のテーブルでは、1から始まる整数キーを使用します。
-- Array style
local fruits = {"apple", "banana", "cherry"}
print(fruits[1]) -- apple (1-indexed!)
-- Dictionary style
local person = {name = "Alice", age = 30}
print(person.name) -- Alice
print(person["age"]) -- 30function:第一級の値
Luaの関数は、function型の第一級の値です。変数に格納したり、引数として渡したり、他の関数から返したりできます。そのためLuaは、関数型プログラミングのパターンに自然に適しています。
関数はfunctionキーワードで定義することも、無名関数を変数に代入することもできます。どちらの形式も同等です。
-- Two equivalent ways to define a function
function greet(name)
return "Hello, " .. name
end
local greet2 = function(name)
return "Hello, " .. name
end
print(type(greet)) -- function
print(greet("Lua")) -- Hello, Luauserdataとthread
userdataは、ホストアプリケーションが管理する任意のCデータを表します。純粋なLuaだけでuserdataを作成することはできません。ゲームエンジンなどのC拡張や組み込み環境から提供されます。これにより、CコードからLuaスクリプトへオブジェクトを公開できます。
threadは、独自のスタックを持つ独立した実行単位であるコルーチンを表します。コルーチンについては専用のレッスンで詳しく扱います。今は、coroutine.create()がthread型の値を返すことを覚えておいてください。
-- thread type via coroutine
local co = coroutine.create(function()
print("coroutine body")
end)
print(type(co)) -- thread
-- userdata comes from C, not creatable in pure Lua
-- type(io.stdin) == "file" is a userdata varianttype()で値を調べる
組み込み関数type()は、引数の型名を表す文字列を常に返します。これは防御的プログラミングやデバッグに役立ちます。結果は型名の文字列と直接比較できます。
type(nil)は値nilそのものではなく、文字列"nil"を返すことに注意してください。これにより、エラーを発生させずに変数がnilを保持しているか安全に確認できます。
local values = {42, "hi", true, nil, {}, function() end}
-- Note: nil in table stops ipairs early
for i = 1, 3 do
print(i, type(values[i]))
end
-- 1 number
-- 2 string
-- 3 boolean他の言語との型の違い
JavaScript、Python、Javaの経験がある場合、Luaのいくつかの型に関する規則には驚くかもしれません。type()から見える独立した整数型はありません。整数も浮動小数点数も"number"を返します。配列にも独自の型はなく、単なるテーブルです。クラスは存在せず、オブジェクトはメタテーブルを持つテーブルです。
こうした違いを理解しておくと、言語を移行するときによくあるバグを防げます。
-- No separate array type
local arr = {1, 2, 3}
print(type(arr)) -- table (not array!)
-- No separate integer type visible
print(type(1)) -- number
print(type(1.0)) -- number
-- math.type distinguishes
print(math.type(1)) -- integer
print(math.type(1.0)) -- float確認問題
Luaでtype(0)は何を返しますか?
まとめ:Luaのデータ型の概要
Luaの8つの型をすべて学びました。
- nil — 値の不在。偽と判定される
- boolean — true/false。nilとfalseだけが偽と判定される
- number — 整数または浮動小数点数。区別にはmath.type()を使う
- string — 変更できないバイト列。連結には..を使う
- table — 配列や辞書に使える汎用コンテナ
- function — 変数に格納できる第一級の値
- userdata — Luaに公開されたCデータ
- thread — コルーチンのハンドル
次は、変数の宣言とグローバルスコープとローカルスコープです。
よくある質問
「Luaのデータ型の概要」レッスンは無料ですか?
はい。「Luaのデータ型の概要」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「Luaのデータ型の概要」で何を学びますか?
nil、boolean、number、string、table、function、userdata型について学びます。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Luaのデータ型の概要」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Luaのデータ型の概要
- Luaで変数を宣言する
- 算術演算子と関係演算子
- 型強制と型変換