0Pricing
Lua Academy · レッスン

Upvalueとは

クロージャが外側のスコープの変数をupvalueとして捕捉する仕組みを理解します。

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

クロージャのまとめ

クロージャとは、外側のスコープにある変数への参照と関数をひとまとめにしたものです。捕捉された変数はupvalueと呼ばれます。

upvalueの例

内側の関数は、外側の関数のスコープにあるcountを捕捉します。

local function makeCounter()
  local count = 0
  return function()
    count = count + 1
    return count
  end
end
local next = makeCounter()
print(next())  -- 1
print(next())  -- 2

Upvalueは生きた変数です

Upvalueはコピーではなく、変数への参照です。クロージャから読み取りと書き込みの両方ができます。

複数のUpvalue

クロージャは、複数の外側のスコープから複数の変数をキャプチャできます。

local function adder(x)
  return function(y) return x + y end
end
local add5 = adder(5)
print(add5(3))  -- 8

Upvalueのライフタイム

Upvalueは、それを参照するクロージャが1つでも生存している限り存在します。参照するすべてのクロージャがガベージコレクションされたときにのみ、ガベージコレクションされます。

debug.getupvalue

debug.getupvalue(fn, n)を使うとUpvalueを調べられます。この関数はn番目のUpvalueの名前と値を返します。

local x = 10
local function f() return x end
print(debug.getupvalue(f, 1))  -- x  10

Upvalueとグローバル変数

Upvalue(クロージャにキャプチャされたローカル変数)は、グローバル変数より高速です。VMはテーブル検索を行わず、インデックスで直接アクセスします。

クローズされたUpvalue

外側のブロックが終了すると、Upvalueはクローズされ、スタックからヒープへ移動されます。クロージャはそのヒープ上のセルを引き続き共有します。

オープンなUpvalueとクローズされたUpvalue

オープン:Upvalueがまだスタック上にある状態(外側の関数がまだ実行中)。クローズ:外側のスコープが終了したときに、Upvalueがヒープへ移動した状態。

実践的なユースケース

Upvalueを使うと、クロージャ内にプライベートな状態を自然に実装できます。モジュール関数は、グローバルに公開せずにプライベートな状態を保持できます。

local id = 0
local function newId()
  id = id + 1
  return id
end

Upvalueの数の上限

各Lua関数は最大255個のUpvalueを参照できます。実際の開発で問題になることはほとんどありません。

Upvalueに関する質問

Upvalueとは何ですか?

まとめ:Upvalue

Upvalueは、クロージャがキャプチャした外側の変数です。外側のスコープが終了した後もヒープ上に保持され、参照によって共有されます。また、グローバル変数を使わずに、変更可能なプライベート状態を提供します。

よくある質問

「Upvalueとは」レッスンは無料ですか?

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

「Upvalueとは」で何を学びますか?

クロージャが外側のスコープの変数をupvalueとして捕捉する仕組みを理解します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Upvalueとは」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

  1. Upvalueとは
  2. クロージャ間で共有されるUpvalue
  3. ファクトリー関数とジェネレーター
  4. クロージャによるメモ化
← Lua Academyに戻る