テーブルの変換:map、filter、reduce
テーブル変換のための関数型高階ヘルパーを作成します。
「テーブルの変換:map、filter、reduce」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
Luaの関数型パターン
Luaには組み込みのmap/filter/reduceはありませんが、クロージャとgeneric forループを使えば簡単に実装できます。
map:すべての要素を変換
mapは各要素に関数を適用し、結果からなる新しいテーブルを返します。
local function map(t, fn)
local result = {}
for i, v in ipairs(t) do result[i] = fn(v) end
return result
end
local doubled = map({1,2,3}, function(x) return x * 2 end)
print(table.concat(doubled, ", ")) -- 2, 4, 6filter:条件に一致する要素を残す
filterは、述語がtrueを返す要素だけを残します。
local function filter(t, pred)
local result = {}
for _, v in ipairs(t) do
if pred(v) then result[#result+1] = v end
end
return result
end
local evens = filter({1,2,3,4,5}, function(x) return x % 2 == 0 end)
print(table.concat(evens, ", ")) -- 2, 4reduce:単一の値へ畳み込む
reduceはアキュムレーターを使い、要素を左から右へ結合します。
local function reduce(t, fn, init)
local acc = init
for _, v in ipairs(t) do acc = fn(acc, v) end
return acc
end
local sum = reduce({1,2,3,4,5}, function(a,b) return a+b end, 0)
print(sum) -- 15操作のチェーン
map、filter、reduceを連結して、表現力の高いデータパイプラインを構築します。
local nums = {1,2,3,4,5,6,7,8,9,10}
local result = reduce(
map(
filter(nums, function(x) return x % 2 == 0 end),
function(x) return x * x end
),
function(a,b) return a + b end, 0
)
print(result) -- 220forEach:副作用
forEachは新しいテーブルを作成せずに反復処理します。表示などの副作用を実行する場合に便利です。
local function forEach(t, fn)
for i, v in ipairs(t) do fn(v, i) end
end
forEach({"a","b","c"}, function(v, i) print(i, v) end)flatMap:mapして平坦化
flatMapは各要素をリストに変換してから、すべてのリストを連結します。
local function flatMap(t, fn)
local result = {}
for _, v in ipairs(t) do
for _, item in ipairs(fn(v)) do
result[#result+1] = item
end
end
return result
end
local expanded = flatMap({1,2,3}, function(x) return {x, x*10} end)zip:2つのテーブルを結合
zipは2つのテーブルの要素を組み合わせ、ペアのテーブルを作成します。
local function zip(a, b)
local result = {}
for i = 1, math.min(#a, #b) do
result[i] = {a[i], b[i]}
end
return result
end
local zipped = zip({1,2,3}, {"a","b","c"})辞書型テーブルの操作
キーと値を持つテーブルでは、ipairsではなくpairsで反復処理し、キーと値のペアを収集します。
local function mapValues(t, fn)
local result = {}
for k, v in pairs(t) do result[k] = fn(v) end
return result
end
local doubled = mapValues({x=1,y=2}, function(v) return v*2 end)遅延評価の概念
大規模なデータセットでは、大きな中間テーブルの作成を避けるため、遅延イテレーター(1回に1つの要素を生成するクロージャ)を検討してください。
パフォーマンスに関する注意
mapとfilterを実行するたびに、新しいテーブルが割り当てられます。タイトなループでは、その場で変更する方が効率的な場合がありますが、不変性と可読性は損なわれます。
reduceに関する質問
reduce({1,2,3,4}, function(a,b) return a+b end, 0)は何を返しますか?
まとめ:map/filter/reduce
mapは変換し、filterは選択し、reduceは畳み込みます。この3つの高階関数は、Luaで関数型データ処理を行う基盤です。
よくある質問
「テーブルの変換:map、filter、reduce」レッスンは無料ですか?
はい。「テーブルの変換:map、filter、reduce」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「テーブルの変換:map、filter、reduce」で何を学びますか?
テーブル変換のための関数型高階ヘルパーを作成します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「テーブルの変換:map、filter、reduce」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コンパレーターによるtable.sort
- table.concatとtable.move
- ディープコピーとシャローコピー
- テーブルの変換:map、filter、reduce