ジェネリック関数の使用
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 59/73。
identity に T が何であるかを決して伝えていません。チェッカーが自動的に推論します。これは型推論です。各呼び出し箇所で、Luau は引数を確認し、T を解決します。
local word = identity("Luau") -- T は string として推論される
local count = identity(12) -- T は number として推論される
local flag = identity(false) -- T は boolean として推論される各呼び出しは独立しています。ある行では T は string になり、次の行では number になることがあります。推論された結果は、手動で書いた注釈と同じくらい安全です。チェッカーにとって word は確実に string であり、完全な自動補完とエラーチェックを利用できます。
TypeScript との重要な違いが 1 つあります。TS では、identity<number>(5) のように、呼び出し箇所で型を強制できます。Luau には呼び出し箇所の型引数がありません。その行は特殊な構文ではないため、Luau は山括弧を小なり比較・大なり比較として解釈し、コードは失敗します。型を明示的に指定したい場合は、代わりに変数に注釈を付けます。
local count: number = identity(12)おなじみのツールを使って、推論が動作する様子を確認できます。typeof は値の実行時の型名を返すため、print(typeof(identity(12))) は number を出力します。つまり、その値は generic function を通過しても完全に変更されていません。
チャレンジ
簡単前のレッスンのジェネリックな identity 関数は、すでにエディターにあります。その型推論を活用しましょう。
チェッカーに T を推論させて、3つの変数を作成します(アノテーションは不要です)。
word:"Luau"を使ってidentityを呼び出すcount:12を使ってidentityを呼び出すflag:falseを使ってidentityを呼び出す
次の内容を、それぞれ別の行に出力します。
wordtypeof(word)の結果counttypeof(count)の結果flagtypeof(flag)の結果
自分で試してみよう
-- 前のレッスンのジェネリックな identity 関数
local function identity<T>(value: T): T
return value
end
-- ここにコードを書いてください
-- 1) identity の呼び出しで word、count、flag を作成する(T は推論させる)
-- 2) 各値とその typeof を続けて出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ