無名関数
CoddyのLuaジャーニー「ロジックと制御フロー」セクションの一部。レッスン 13/54。
関数を変数に格納して受け渡せることがわかったところで、さらに簡潔な書き方を紹介します。関数に必ず名前を付ける代わりに、必要な場所で直接作成できます。これらは匿名関数と呼ばれます。
匿名関数とは、名前のない関数のことです。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引数として関数を直接作成します。これによりコードがよりコンパクトになり、ソートのロジックを使用する場所にそのまま置いておけます。
チャレンジ
簡単filterByThreshold 関数を作成してください。この関数は numbers と threshold を受け取り、しきい値より大きい数値だけを含む新しいテーブルを返します。
エディターにはすでにヘルパー関数 filter(list, keep) があります。この関数は各値に対して keep(value) を呼び出し、keep が true を返した値を含む新しいテーブルを返します。filter を呼び出し、レッスンで table.sort() に関数を渡すときと同じように、チェック処理を呼び出しの中に直接書いた匿名関数として渡してください。チェック処理を変数に保存したり、名前を付けたりしないでください。
パラメーター:
numbers(テーブル): 数値を含むリスト形式のテーブルthreshold(数値): フィルタリングの最小値(この値は含まない)
戻り値: しきい値より大きい数値だけを含むテーブル(テーブル)
自分で試してみよう
local function filter(list, keep)
local result = {}
for _, value in ipairs(list) do
if keep(value) then
table.insert(result, value)
end
end
return result
end
function filterByThreshold(numbers, threshold)
-- ここにコードを書いてください
end
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックと制御フローのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ