無名関数
CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 13/54。
関数を変数に格納したり、受け渡したりできることが理解できたところで、それらを記述するためのさらに簡潔な方法があります。常に関数に名前を付ける代わりに、必要な場所で直接作成することができます。これらは無名関数(anonymous functions)と呼ばれます。
匿名関数とは、単に名前のない関数のことです。functionキーワードを使用し、その直後にパラメータと本体を続けて定義します:
function(a, b)
return a + b
endこれにより、すぐに使用できる関数値が作成されます。無名関数は、関数を他の関数に引数として渡す際に特に便利です。先ほどのカスタムソートの例を覚えていますか?無名関数を使用すると、次のようになります:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)比較のために別の名前付き関数を定義する代わりに、その関数は table.sort() の第2引数として直接作成されます。これにより、コードがよりコンパクトになり、ソートのロジックを使用する場所にそのまま保持できます。
チャレンジ
簡単numbers と threshold を受け取り、しきい値(threshold)より大きい数値のみを含む新しいテーブルを返す関数 filterByThreshold を作成してください。
数値をフィルタリングするために、無名関数のアプローチで table.insert() を使用してください。個別の名前付き関数を定義せずに、インラインでフィルタリングロジックを作成してください。
ロジック:
- 空の結果テーブルを作成する
- numbers テーブルを反復処理する
- 各数値について、無名関数を使用してしきい値を超えているかチェックする
- チェックが true を返した場合、その数値を結果テーブルに追加する
- フィルタリングされた結果テーブルを返す
パラメータ:
numbers(table): 数値を含むリスト形式のテーブルthreshold(number): フィルタリングのための最小値(この値は含まない)
戻り値: しきい値より大きい数値のみを含むテーブル (table)
チートシート
匿名関数は、名前のない関数であり、functionキーワードの後にパラメータと本体を続けて定義されます:
function(a, b)
return a + b
end匿名関数は、関数を引数として渡す際に便利で、ロジックを使用する場所にインラインで記述できます:
local players = {
{name = "Alice", score = 150},
{name = "Bob", score = 200},
{name = "Charlie", score = 175}
}
table.sort(players, function(a, b)
return a.score > b.score
end)これにより、比較関数をtable.sort()の引数として直接作成し、コードをより簡潔にすることができます。
自分で試してみよう
function filterByThreshold(numbers, threshold)
-- ここにコードを記述してください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。