ファクトリー関数とジェネレーター
クロージャをファクトリー関数として使い、設定済みの関数インスタンスを生成します。
「ファクトリー関数とジェネレーター」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
Factory Functionとは
factory functionとは、引数とUpvalueによって設定された別の関数を作成して返す関数です。
シンプルな乗算ファクトリ
multiplierを呼び出すたびに、異なるfactorをキャプチャした新しいクロージャが返されます。
local function multiplier(factor)
return function(x) return x * factor end
end
local double = multiplier(2)
local triple = multiplier(3)
print(double(5)) -- 10
print(triple(5)) -- 15設定可能なロガーファクトリ
ロガーファクトリはプレフィックス文字列をキャプチャし、ログ関数を返します。
local function makeLogger(prefix)
return function(msg)
print("[" .. prefix .. "] " .. msg)
end
end
local info = makeLogger("INFO")
local warn = makeLogger("WARN")
info("started")
warn("low memory")カウンタージェネレーター
ジェネレーターは内部状態を保持し、呼び出すたびに新しい値を生成します。
local function counter(start, step)
local n = start - step
return function()
n = n + step
return n
end
end
local evens = counter(0, 2)
print(evens(), evens(), evens()) -- 0 2 4範囲ジェネレーター
範囲ジェネレーターはfromからtoまでの値を生成し、値をすべて返し終えるとnilを返します。
local function range(from, to, step)
step = step or 1
local i = from - step
return function()
i = i + step
if i <= to then return i end
end
end
for v in range(1, 5) do print(v) end部分適用
ファクトリは引数を部分的に適用して、関数の特化版を作成します。
local function partial(fn, ...)
local args = {...}
return function(...)
local all = {table.unpack(args)}
for _, v in ipairs({...}) do all[#all+1] = v end
return fn(table.unpack(all))
end
end
local add = function(a,b) return a+b end
local add10 = partial(add, 10)
print(add10(5)) -- 15メモ化ファクトリ
ファクトリを使って、コストの高い関数のメモ化版を作成できます。
local function memoize(fn)
local cache = {}
return function(x)
if cache[x] == nil then cache[x] = fn(x) end
return cache[x]
end
end状態を持つトークンLexer
Lexerファクトリは入力文字列と位置をキャプチャし、呼び出すたびに次のトークンを生成します。
local function lexer(input)
local pos = 1
return function()
if pos > #input then return nil end
local token = input:match("%S+", pos)
if token then pos = pos + #token + 1 end
return token
end
endジェネレーターとコルーチン
クロージャベースのジェネレーターはシンプルですが、すべての状態をUpvalueに保持します。コルーチンベースのジェネレーターはより強力で、複雑なロジックのどこでもyieldできます。
関数テンプレート
ファクトリは関数テンプレートを作成します。これは、作成時にパラメーター化された共通パターンであり、異なる設定で何度も再利用できます。
カリー化
カリー化された関数は、一度に1つずつ引数を受け取り、すべての引数が渡されるまで新しい関数を返します。
local function curry2(fn)
return function(a)
return function(b)
return fn(a, b)
end
end
end
local curriedAdd = curry2(function(a,b) return a+b end)
print(curriedAdd(3)(4)) -- 7ファクトリに関する質問
Factory Functionの主な特徴は何ですか?
まとめ:Factory Function
Factory Functionは設定済みのクロージャを生成し、部分適用、ジェネレーター、メモ化、カリー化を可能にします。Luaにおける最も強力な関数型パターンの1つです。
よくある質問
「ファクトリー関数とジェネレーター」レッスンは無料ですか?
はい。「ファクトリー関数とジェネレーター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Upvalueとは
- クロージャ間で共有されるUpvalue
- ファクトリー関数とジェネレーター
- クロージャによるメモ化