0Pricing
Lua Academy · レッスン

ファクトリー関数とジェネレーター

クロージャをファクトリー関数として使い、設定済みの関数インスタンスを生成します。

「ファクトリー関数とジェネレーター」は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フィードバックを取得できます。ローカル設定は不要です。

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

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