0Pricing
Lua Academy · レッスン

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))       -- nil

nil:値の不在

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") end

number:整数と浮動小数点数

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"]) -- 30

function:第一級の値

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, Lua

userdataと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 variant

type()で値を調べる

組み込み関数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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaのデータ型の概要
  2. Luaで変数を宣言する
  3. 算術演算子と関係演算子
  4. 型強制と型変換
← Lua Academyに戻る