ディープコピーとシャローコピー
再帰的なディープコピーを実装し、参照のセマンティクスを理解します。
「ディープコピーとシャローコピー」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
Luaの参照セマンティクス
Luaでテーブルを別の変数へ代入すると、データではなく参照がコピーされます。両方の変数が同じテーブルを指します。
local a = {1, 2, 3}
local b = a
b[1] = 99
print(a[1]) -- 99, a is affected!浅いコピー
浅いコピーでは、同じトップレベルのキーと値を持つ新しいテーブルを作成します。ネストされたテーブルは共有されたままです。
local function shallowCopy(t)
local copy = {}
for k, v in pairs(t) do copy[k] = v end
return copy
end浅いコピーの制限
浅いコピー内のネストされたテーブルを変更すると、元のテーブルにも影響します。
local orig = {data = {1, 2, 3}}
local sc = shallowCopy(orig)
sc.data[1] = 99
print(orig.data[1]) -- 99 (shared!)再帰による深いコピー
深いコピーでは、ネストされたすべてのテーブルを再帰的に複製し、共有されているすべての参照を分離します。
local function deepCopy(orig)
local copy
if type(orig) == "table" then
copy = {}
for k, v in pairs(orig) do
copy[deepCopy(k)] = deepCopy(v)
end
setmetatable(copy, getmetatable(orig))
else
copy = orig
end
return copy
end深いコピーの動作
深いコピーの後でコピー側のネストされたテーブルを変更しても、元のテーブルには影響しません。
local orig = {data = {1, 2, 3}}
local dc = deepCopy(orig)
dc.data[1] = 99
print(orig.data[1]) -- 1 (independent!)循環の処理
単純な深いコピーは、循環するテーブルで問題が発生します。訪問済みのテーブルをメモテーブルに記録して、循環を処理します。
local function deepCopyMemo(orig, memo)
memo = memo or {}
if type(orig) ~= "table" then return orig end
if memo[orig] then return memo[orig] end
local copy = {}
memo[orig] = copy
for k, v in pairs(orig) do
copy[deepCopyMemo(k, memo)] = deepCopyMemo(v, memo)
end
setmetatable(copy, getmetatable(orig))
return copy
endメタテーブルのコピー
OOPの振る舞いを保持するには、setmetatable(copy, getmetatable(orig))を使ってメタテーブルも深くコピーします。
table.moveによる浅いコピー
連続した配列では、table.moveを使って高速な浅い複製を作成できます。
local function arrayCopy(t)
return table.move(t, 1, #t, 1, {})
end使い分け
- 浅いコピー:単純なフラットテーブル、パフォーマンスが重要な複製。
- 深いコピー:ネストされた構造、シリアライゼーション、不変スナップショット。
関数の値
関数自体はコピーされません。浅いコピーでも深いコピーでも、同じ関数参照を共有します。通常、これは望ましい動作です。
パフォーマンスに関する考慮事項
深いコピーの計算量はノード数に対してO(n)です。非常に大きなツリーでは、代わりに構造共有やコピーオンライトのパターンを検討してください。
コピーの種類に関する質問
浅いコピーの後で、コピー内のネストされたテーブルを変更するとどうなりますか?
まとめ:深いコピーと浅いコピー
浅いコピーはトップレベルのキーだけを複製し、ネストされたテーブルは共有します。深いコピーはすべてを再帰的に複製します。無限再帰を防ぐには、メモテーブルで循環を処理します。
よくある質問
「ディープコピーとシャローコピー」レッスンは無料ですか?
はい。「ディープコピーとシャローコピー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「ディープコピーとシャローコピー」で何を学びますか?
再帰的なディープコピーを実装し、参照のセマンティクスを理解します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ディープコピーとシャローコピー」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。