ジェネリックなアイデンティティ関数
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 58/73。
正しく書かれた identity 関数がこちらです — ジェネリック関数として定義されています:
local function identity<T>(value: T): T
return value
end関数名の後にある <T> は型パラメーターを宣言しています。これは「呼び出しごとに決定される何らかの型」を表すプレースホルダーです。シグネチャの内部では、T を実際の型と全く同じように使用します:パラメーターは T であり、関数は T を返します。
入力と出力に同じ T を使用することが重要なポイントです — これによって両者が関連付けられます。identity("hello") を呼び出すと、チェッカーはその呼び出しに対して T = string と決定するため、結果は string になります。identity(42) を呼び出すと T = number になるため、結果は number になります。1つの処理本体で、すべての型に対応し、情報が失われることはありません。
T は慣習的な名称("Type" の略)に過ぎません — <Item> や <Value> でも同様に動作します。そして Luau で常にそうであるように、山括弧はチェッカーのためだけに存在します:実行時には、これは通常の Lua 関数 function identity(value) return value end となります。
チャレンジ
簡単以下を行う identity という名前のジェネリック関数を作成してください:
- 型パラメータ
Tを宣言する - 型
Tのvalueという名前のパラメータを1つ受け取る - その値を返し、戻り値の型を
Tとする
次に、作成した関数を使用して以下の型付き変数を作成してください:
- 型
numberのluckyNumber—identityを7で呼び出す - 型
stringのgreeting—identityを"Hello, Luau!"で呼び出す - 型
booleanのisReady—identityをtrueで呼び出す
以下をそれぞれ個別の行に出力してください:
luckyNumbergreetingisReadyprintの中で直接identityを"<code>generics" で呼び出した結果printの中で直接identityを99で呼び出した結果
自分で試してみよう
-- ここにコードを書いてください
-- 1) identity<T>(value: T): T を定義する
-- 2) identity の呼び出しで luckyNumber、greeting、isReady を作成する
-- 3) それらを出力し、次に identity(the exact text from the instructions) と identity(99) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ