Menu
CoddyTech

匿名函数

本课属于 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()。这样代码更紧凑,也能让排序逻辑紧挨着使用它的地方。

challenge icon

挑战

简单

编写一个函数 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
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: Lua 在线编译器