ジェネリクスが解決する問題
CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 61/80。
渡された値をそのまま返すだけの関数、つまり恒等関数が必要だとします。ここまでに学んだ型では、2つの方法がありますが、どちらも困ったことになります。
1つ目の方法は、型ごとに別々の関数を用意することです。関数本体は同じで、注釈だけが異なります。
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
end新しい型が増えるたびに関数をもう1つ複製することになり、ある関数で修正したバグは、ほかのすべての関数でも修正しなければなりません。これはまさに、関数を使って避けようとしている重複です。
2つ目の方法は、any型を使って1つの関数にまとめることです。
local function echo(value: any): any
return value
endこれで1つの関数ですべてを扱えるようになりますが、その代わりに型安全性を失います。echo("hello")を呼び出しても、チェッカーは戻り値が文字列だとわからなくなります。わかるのはany型だということだけなので、オートコンプリートが使えなくなり、型エラーも見逃されます。つまり、渡した値と返ってくる値のつながりが失われてしまいます。
本当に必要なのは、あらゆる型で動作し、しかも呼び出しごとに使われた型を覚えている関数です。それを実現するのがジェネリクスで、この章ではそれを学びます。
チャレンジ
簡単echoのany版が何を忘れるのか見てみましょう。
valueを返すlocal function echo(value: any): anyを書きましょう。echo("hello")をlocal resultに格納しましょう。result、次にtypeof(result)を出力しましょう。
コードを実行を押すと、出力にhelloとstringが表示されます。
自分で試してみよう
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) result と typeof(result) を出力する
Luau入門のすべてのレッスン
自分で練習してみよう: Luauオンラインコンパイラ