ジェネリックなアイデンティティ関数
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 58/73。
こちらが、generic function として正しく実装された identity です:
local function identity<T>(value: T): T
return value
end関数名の後にある <T> は type parameter を宣言します。これは「各 call で決まる何らかの type」を表すプレースホルダーです。シグネチャ内では、実際の type と同じように T を使用します。つまり、パラメーターは T であり、関数は T を返します。
入力と出力に 同じ T を使うことが、この仕組みの核心です。これによって両者が結び付けられます。identity("hello") を call すると、チェッカーはその call について T = string と判断するため、result は string になります。identity(42) を call すると、T = number となるため、result は number になります。1つの本体で、every type に対応し、何も失われません。
T はあくまで慣用的な名前(「Type」の略)です。<Item> や <Value> でも同じように機能します。そして Luau ではいつもそうですが、山かっこはチェッカーのためだけに存在します。runtime では、これは単純な Lua 関数である function identity(value) return value end です。
チャレンジ
簡単identityという名前の generic function を作成します。この関数は次の要件を満たします。
- type パラメーター
Tを宣言する - type
Tのvalueという名前のパラメーターを 1 つ受け取る - その値を、return type
Tで返す
次に、関数を使用して次の型付き変数を作成します。
- type
numberのluckyNumber:7を指定してidentityを call する - type
stringのgreeting:"Hello, Luau!"を指定してidentityを call する - type
booleanのisReady:trueを指定してidentityを call する
次の内容を、それぞれ 1 行ずつ print します。
luckyNumbergreetingisReady"<code>generics" を指定して、printの中で直接identityを call した結果99を指定して、printの中で直接identityを call した結果
自分で試してみよう
-- ここにコードを書いてください
-- 1) identity<T>(value: T): T を定義する
-- 2) identity の呼び出しで luckyNumber、greeting、isReady を作成する
-- 3) それらを出力し、次に identity(指示からの正確なテキスト) と identity(99) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数自分で練習してみよう: Luaオンラインコンパイラ