0Pricing
Lua Academy · レッスン

ディープコピーとシャローコピー

再帰的なディープコピーを実装し、参照のセマンティクスを理解します。

「ディープコピーとシャローコピー」は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フィードバックを取得できます。ローカル設定は不要です。

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

  1. コンパレーターによるtable.sort
  2. table.concatとtable.move
  3. ディープコピーとシャローコピー
  4. テーブルの変換:map、filter、reduce
← Lua Academyに戻る