0X17函数为值
前置知识
正文
- 函数定义的语句可以看作一种比较复杂而且比较长的字面值。这个字面值所表示的不是数字,也不是字符串,而是一个函数。(确切地说,匿名函数表达式才是真正的函数字面值。带变量名的函数定义表达式还融合了赋值功能。这个后续会进一步讨论。)
- 在Lua中函数也被当作值来处理。而且和其他类型的值一样可以用变量存储、可以传递给函数作为参数、可以作为函数的返回值。
- 但是函数变量有一种别的类型没有特殊的运算——调用。就是我们之前所说的往函数名后边加圆括号和参数列表。就表示调用执行函数。
- 如果函数名后边没有圆括号和参数列表,它就只是一个存储有函数类型值的变量。它可以给其他变量赋值,也可以被赋予新值。例如:
>
>theFunc=print
>print=456
>theFunc(print)
>
第一句把print的值赋予theFunc,此后theFunc(str)的效果就和之前print(str)一样。第二句赋新值给print变量。第三句输出print目前保存的整数值456。
- 再来看看接受函数参数的函数:
>
>function cal(x,fun)
> print(fun(x))
>end
>
fun应该是一个函数,x是一个数。计算fun(x)的值,然后输出这个值。可以这样使用:
>>function sq(x) return x*x end
>function linear(x) return 3*x+7 end
>cal(4,sq)
>cal(4,linear)
>
- 然后是把函数作为返回值的函数。
>
>function hello() print('hello world') end
>function myFunc() return hello end
>f=myFunc()
>f()
>
第一句定义了一个名为hello的函数,它输出“hello world”。第二句定义的函数把hello函数作为返回值。第三句运行myFunc。第四局运行myFunc的返回值。
其实最后两句可以合并一下。myFunc()()的写法也是可以的。
- 把函数作为返回值更多见的情况是在一个函数定义内嵌套了函数定义。这里给出一个例子(下一节中会说明,对addFun这个函数的定义其实等价于"addFun=function (y) return x+y end。"):
>
>function addSomething(x)
> function addFun(y)
> return x+y
> end
> return addFun
>end
>
>f1=addSomething(4)
>f1(8)
>
- 视频演示: 函数作为变量的值 https://www.bilibili.com/video/av15314257/
- 想要进一步理清上一条中写的函数定义嵌套。需要介绍一些关于变量的作用域的问题。真个问题将在下一部分讨论。
后续推荐