美文网首页Lua教程
Lua极简入门(七)——函数高级特性

Lua极简入门(七)——函数高级特性

作者: 李小磊_0867 | 来源:发表于2019-11-01 11:25 被阅读0次

在Lua中函数和其他类型的值具有相同权利,如函数和数值、字符串等具有相同地位。因此函数也可以像其他类型一样存储到变量、table(对象)中,也可以作为参数传递到其他任意函数中,同时也可以作为返回值从函数中返回。

  • 函数存储在变量中
print(print)
-->> function: 00000000684989c0
local p = print
print(p)
-->> function: 00000000684989c0

函数可以存储在变量中,printp都指向了同一个函数。

print(123)
p(123)
local t = {p = print, a = math.abs}
print(t.p(t.a(-98)))

print(123)p(123)结果一致,表示发起了函数调用,这也说明函数可以存储到变量中。实际上函数名就是一个变量,比如print就是一个打印的函数变量,并不是函数本身。

p = print
print = math.abs
p(print(-9))
-->> 9
print = p
print(-9)
-->> -9

math.abs函数指向print时,并且之后的测试中可以看出,系统中的print只是指向打印函数的变量,并不是函数本身,print可以再次被赋值,指向其他数据类型或新的函数,并且不影响打印函数本身。当再次指向p时,其又恢复了原始功能。

  • 函数可以作为参数传入函数

从上面可以看出变量可以指向函数,在访问指向函数的变量时,可以获得函数的同等功能;而变量可以作为实参传入函数,那么就可以将指向函数的变量,传入一个函数中。

接收两一个函数作为实参的函数称为高阶函数

function add(a, b, f)
    return f(a) + f(b)
end

print(add(-9, -8, math.abs))
-->> 17
local total = add(7, -3, function(a)
    return a * 2
end)
print(total)
-->> 8
  • 函数可以嵌套在另外一个函数中

Lua不仅可以在函数中嵌套新的函数,同时嵌套的函数还可以访问外部变量。

local nums = { 1, 2, 3, 4, 5 }

function add(a)
    b = function()
        local t = 0
        for i, v in pairs(nums) do
            t = t + v
        end
        return t
    end
    print(a .. "calc is :" .. b())
end

add("nums")
-->> numscalc is :15

对于Lua,定义的函数其实都是使用function()进行定义的,函数定义完成后,将其指向了变量,如本例中的内部函数b。从这个例子中,也能够证明前面所说的函数名本身只是指向函数的变量,并不是函数本身。

嵌套的函数还可以作为结果从函数中返回。

function worker(numbers)
    return function()
        total = 0
        for i, v in pairs(numbers) do
            total = total + v
        end
        return total
    end
end

sum = worker({1,2,3})
print("结果=" .. sum())
-->> 结果=6

在这个例子中,返回了一个新的函数,只有在调用该函数的时候,才执行了真正的数组累加,营造了一种延迟执行的现象,当返回一个函数时,将相关的数据都保存在函数中返回,这种行为称为闭包

相关文章

  • Lua极简入门(七)——函数高级特性

    在Lua中函数和其他类型的值具有相同权利,如函数和数值、字符串等具有相同地位。因此函数也可以像其他类型一样存储到变...

  • Lua极简入门(七)——函数高级特性(闭包)

    闭包 当出现一个函数内嵌套另一个函数时,嵌套函数可以访问父函数的数据及资源,称为闭包。Lua的闭包原则就是一个函数...

  • Lua极简入门(六)——函数

    在完成一些编码工作时,总会有一些相似或者重复的工作。比如在结算工资时,员工的工资不同,但缴纳税、社保等计算是一个相...

  • Lua极简入门(六)——函数定义

    对于Lua,定义个函数,非常简单。只需要使用function语句,接下来需要明确函数名、括号,参数列表,最后以en...

  • lua入门笔记 目录

    lua的中文API lua入门笔记1 类型 表达式 语句 函数lua入门笔记2 深入函数 深入函数 迭代器与泛型f...

  • Lua极简入门(六)——函数的参数

    函数定义完成后,那么函数的调用方式,完成的功能,以及返回值都将固定。此时就剩下调用了,对于调用函数,只需要关注参数...

  • Lua极简入门(五)——循环

    在编写代码的过程中,总有许多迭代的代码需求,如计算从1连加到10的计算,如果数字足够大,使用表达式计算的方法,将无...

  • Lua极简入门(二)——基础

    lua不需要使用;分割语句,但使用了;进行分割语句,也是合法的。一般情况下,一行代码表示一个语句,当行内出现多个语...

  • Lua极简入门——类型(一)

    nil 该类型,只有一个值nil,主要用于区分其他任何值,它代表了没有任何有效值。当一个变量第一次赋值前,默认为n...

  • Lua极简入门——类型(二)

    string 字符串标识一个字符序列,采用8位编码。Lua字符串是不可变的值,创建后不能再修改内部字符,如果要进行...

网友评论

    本文标题:Lua极简入门(七)——函数高级特性

    本文链接:https://www.haomeiwen.com/subject/etjfbctx.html