ジェネリック関数の使用
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を出力します。値はジェネリック関数を通っても、まったく変わっていません。
チャレンジ
簡単各呼び出しでチェッカーに T を推論させましょう。
- 関数の下で、注釈を付けずに
identity("Oslo")をlocal cityに、identity(42)をlocal floorsに格納します。 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オンラインコンパイラ