Menu
CoddyTech

ジェネリクスが解決する問題

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型だということだけなので、オートコンプリートが使えなくなり、型エラーも見逃されます。つまり、渡した値と返ってくる値のつながりが失われてしまいます。

本当に必要なのは、あらゆる型で動作し、しかも呼び出しごとに使われた型を覚えている関数です。それを実現するのがジェネリクスで、この章ではそれを学びます。

challenge icon

チャレンジ

簡単

echoのany版が何を忘れるのか見てみましょう。

  1. valueを返すlocal function echo(value: any): anyを書きましょう。
  2. echo("hello")をlocal resultに格納しましょう。
  3. result、次にtypeof(result)を出力しましょう。

コードを実行を押すと、出力にhelloとstringが表示されます。

自分で試してみよう

-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) result と typeof(result) を出力する

Luau入門のすべてのレッスン

自分で練習してみよう: Luauオンラインコンパイラ