0Pricing
Lua Academy · レッスン

辞書としてのテーブル

文字列キーや混在キーを使ってキーと値のペアを格納します。

「辞書としてのテーブル」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

文字列キー

文字列キーを持つテーブルは、辞書(ハッシュマップ)として機能します。有効な識別子にはドット記法t.keyを、それ以外の文字列にはブラケット記法t["key"]を使ってフィールドにアクセスします。どちらも同等ですが、ブラケット記法では動的なキーを扱えます。

local user = {}
user.name = "Alice"
user["age"] = 30
user.role = "admin"

print(user.name)        -- Alice
print(user["age"])      -- 30

local field = "role"
print(user[field])      -- admin (dynamic key)

テーブルリテラル

辞書は、key = value構文を使うテーブルリテラルで初期化できます。これはLuaでレコードを作成する最も一般的な方法です。1つのリテラル内で、配列形式のエントリと辞書形式のエントリを混在させることもできます。

local config = {
  host = "localhost",
  port = 3306,
  database = "myapp",
  debug = false,
  tags = {"web", "api"},  -- nested array
}

print(config.host)        -- localhost
print(config.port)        -- 3306
print(config.tags[1])     -- web

辞書によるカウント

辞書の典型的な用途は、出現頻度のカウントです。リストを反復し、各要素をキーとしてカウントを増やします。増加させる前にnilかどうかを確認し、初期値にはcount[word] or 0を使います。

local words = {"lua","is","fast","lua","is","lua"}
local freq = {}

for _, w in ipairs(words) do
  freq[w] = (freq[w] or 0) + 1
end

for word, count in pairs(freq) do
  print(word, count)
end
-- lua 3, is 2, fast 1

辞書によるグループ化

プロパティでデータをグループ化するには、リストを反復し、グループ化キーを使って辞書内のリストに要素を追加します。これは、LuaにおけるSQLのGROUP BYやPythonのdefaultdictパターンに相当します。

local people = {
  {name="Alice", dept="eng"},
  {name="Bob",   dept="hr"},
  {name="Carol", dept="eng"},
  {name="Dave",  dept="hr"},
}
local groups = {}

for _, p in ipairs(people) do
  local d = p.dept
  groups[d] = groups[d] or {}
  groups[d][#groups[d]+1] = p.name
end

print(table.concat(groups.eng, ", "))  -- Alice, Carol

キーの存在確認

キーの値をnilと比較すると、そのキーが存在するかどうかを確認できます。ただし、キーに保存された値自体がnilの場合、そのキーは存在しないと見なされるため注意してください。存在フラグには、値としてnilではなくtrueを保存します。

local cache = {result=42, mode="fast"}

if cache.result ~= nil then
  print("cached:", cache.result)  -- 42
end

-- Key not present:
if cache.timeout == nil then
  print("no timeout set")
end

-- Membership set pattern
local allowed = {admin=true, editor=true}
if allowed["admin"] then
  print("access granted")
end

キーの削除

テーブルのキーにnilを設定すると、そのキーを削除できます。キーと値の組は消え、ガベージコレクターが値のメモリを回収できるようになります。この方法でローカル変数を削除することはできません。削除できるのはテーブルのエントリだけです。

local session = {token="abc123", user="Alice", expires=3600}
print(session.token)   -- abc123

session.token = nil
print(session.token)   -- nil (removed)

-- Count remaining keys
local count = 0
for _ in pairs(session) do count = count + 1 end
print(count)   -- 2

辞書のマージ

一方のテーブルを反復して、そのエントリをもう一方のテーブルにコピーすると、2つのテーブルをマージできます。同じキーがある場合は、2番目のテーブルの値が優先されます。これはLuaにおけるJavaScriptのObject.assignに相当します。

local defaults = {color="blue", size=12, bold=false}
local overrides = {color="red", italic=true}

local function merge(base, over)
  local result = {}
  for k, v in pairs(base) do result[k] = v end
  for k, v in pairs(over) do result[k] = v end
  return result
end

local opts = merge(defaults, overrides)
print(opts.color, opts.size, opts.italic)  -- red 12 true

任意のキー型

テーブルのキーには、nilとNaN以外の任意の値を使えます。文字列、数値、ブール値、関数、さらには別のテーブルもキーにできます。整数キーと文字列キーは内部では異なる方法で保存されますが、ブラケット記法で同じようにアクセスできます。

local t = {}
local function myKey() end

t["string"] = 1
t[42] = 2
t[true] = 3
t[myKey] = 4

print(t["string"])  -- 1
print(t[42])        -- 2
print(t[true])      -- 3
print(t[myKey])     -- 4

順序付き反復

Luaのpairs()は反復順序を保証しません。定義した順序で反復するには、キーを配列に集めて並べ替えてから反復します。

local scores = {Alice=95, Bob=87, Carol=91, Dave=78}

local names = {}
for name in pairs(scores) do
  names[#names+1] = name
end
table.sort(names)

for _, name in ipairs(names) do
  print(name, scores[name])
end
-- Alice 95, Bob 87, Carol 91, Dave 78 (sorted)

デフォルト値パターン

__indexメタテーブルを介して「defaults」テーブルにアクセスする便利なパターンがあります。メインテーブルにキーが見つからない場合、Luaは「defaults」テーブルを検索します。これにより、マージせずに階層化された設定を実現できます。

local defaults = {timeout=30, retries=3, verbose=false}
local config = {timeout=60}

setmetatable(config, {__index = defaults})

print(config.timeout)  -- 60  (overridden)
print(config.retries)  -- 3   (from defaults)
print(config.verbose)  -- false (from defaults)

クイックチェック

Luaでテーブルtからキー"x"を削除するには、どうすればよいですか?

復習:辞書としてのテーブル

重要なポイント:

  • ドット記法とブラケット記法:t.key == t["key"]
  • nilでもNaNでもない値は、すべてキーにできます
  • nilを設定するとキーを削除できます
  • 出現頻度のカウント:t[k] = (t[k] or 0) + 1
  • 順序付き反復:キーを集める → 並べ替える → 反復する
  • デフォルト値には__indexメタテーブルを使います

よくある質問

「辞書としてのテーブル」レッスンは無料ですか?

はい。「辞書としてのテーブル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「辞書としてのテーブル」で何を学びますか?

文字列キーや混在キーを使ってキーと値のペアを格納します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「辞書としてのテーブル」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. 配列としてのテーブル
  2. 辞書としてのテーブル
  3. pairsとipairsによるテーブルの反復処理
  4. ネストしたテーブルと構造化データ
← Lua Academyに戻る