ジェネリックなアイデンティティ関数
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 58/73。
正しく記述されたジェネリック関数(generic function)としての identity 関数の例がこちらです:
local function identity<T>(value: T): T
return value
end関数名の後にある <T> は型パラメータ(型引数)を宣言しています。これは「呼び出しごとに決定される何らかの型」を表すプレースホルダーです。シグネチャ内では、T を実際の型と同じように使用します。パラメータは T 型であり、関数は T 型を返します。
入力と出力に同じ T を使用することがポイントであり、これによって両者が結び付けられます。identity("hello") を呼び出すと、チェッカーはその呼び出しに対して T = string と判断するため、result(結果)は 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—7を渡してidentityを呼び出すstring型のgreeting—"Hello, Luau!"を渡してidentityを呼び出すboolean型のisReady—trueを渡してidentityを呼び出す
以下をそれぞれ改行して出力してください:
luckyNumbergreetingisReadyprintの中で直接"generics"を渡してidentityを呼び出した結果printの中で直接99を渡してidentityを呼び出した結果
自分で試してみよう
-- ここにコードを書いてください
-- 1) identity<T>(value: T): T を定義する
-- 2) identity の呼び出しで luckyNumber、greeting、isReady を作成する
-- 3) それらを出力し、その後 identity("generics") と identity(99) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数