匿名函数
本课属于 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()。这样代码更紧凑,也能让排序逻辑紧挨着使用它的地方。
挑战
简单编写一个函数 filterByThreshold,接收 numbers 和 threshold,并返回一个只包含大于 threshold 的数字的新表。
编辑器中已有一个辅助函数 filter(list, keep):它会对每个值调用 keep(value),并返回一个新表,其中只包含 keep 返回 true 的值。调用 filter,并将检查条件作为匿名函数直接写在调用中传入,就像本课将匿名函数传给 table.sort() 一样。不要把检查条件存入变量,也不要为它命名。
参数:
numbers(表):包含数值的列表式表threshold(数字):用于筛选的最小值(不包含)
返回值:只包含大于 threshold 的数字的表(table)
亲手试试
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 在线编译器