Menu
CoddyTech

ジェネリック関数の使用

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 63/80。

identityにTが何であるかを伝える必要はありません。型チェッカーが自分で判断します。これが型推論です。呼び出し箇所ごとに、Luauは引数を見てTを推論します。

local word = identity("Luau")   -- T は string と推論される
local count = identity(12)      -- T は number と推論される
local flag = identity(false)    -- T は boolean と推論される

それぞれの呼び出しは独立しています。ある行ではTが文字列になり、次の行では数値になることもあります。推論された結果は、手書きの型注釈と同じくらい安全です。型チェッカーにとってwordはstringです。完全な自動補完とエラーチェックも利用できます。

TypeScriptとの重要な違いが1つあります。TSでは、呼び出し箇所でidentity<number>(5)のように型を指定できます。Luauには呼び出し箇所で指定する型引数がありません。この行は特別な構文ではないため、Luauは山括弧を小なり・大なり比較として読み取り、コードはエラーになります。型を明示したい場合は、代わりに変数に型注釈を付けます。

local count: number = identity(12)

おなじみのツールを使って、推論の動作を確認できます。typeofは値の実行時の型名を返すので、print(typeof(identity(12)))はnumberを出力します。値はジェネリック関数を通っても、まったく変わっていません。

challenge icon

チャレンジ

簡単

各呼び出しでチェッカーに T を推論させましょう。

  1. 関数の下で、注釈を付けずに identity("Oslo") を local city に、identity(42) を local floors に格納します。
  2. typeof(city) を出力し、次に typeof(floors) を出力します。

コードを実行を押すと、出力に string と number が表示されます。

自分で試してみよう

-- 前回のレッスンで扱ったジェネリックな identity 関数
local function identity<T>(value: T): T
    return value
end

-- 1) アノテーションなしで identity の呼び出しから city と floors を得る
-- 2) それぞれの typeof を出力する

Luau入門のすべてのレッスン

自分で練習してみよう: Luauオンラインコンパイラ