Function(函数)

简介: Function(函数)

Lua 语言中,函数Function )是对语句和表达式进行抽象的主要方式。函数既可以用于完成某种特定任务(有时在其他语言中也被称为过程(procedure)或子历程(subroutine)),也可以只是进行一些计算然后返回计算结果。在前一种情况下,我们将一句函数调用视为一条语句;而在后一种情况下,我们则将函数调用视为表达式:

print(8*9, 9/8)
a = math.sin(3) + math.cos(10)
print(os.date())


无论那种情况,函数调用时都需要使用一对圆括号把参数列表括起来。即使被调用的函数不需要参数,也需要一对空括号。对于这个规则,唯一的例外就是,当函数只有一个参数且该参数是字符串常量表构造器时,括号是可选的。

print "Hello world"         <-->          print("Hello world")
dofile 'a.lua'              <-->          dofile('a.lua')
print [[a multi-line        <-->          print([[a multi-line
  message                                   message
]]                                        ]])
f{x=10, y=20}               <-->          f({x=10, y=20})
type{}                      <-->          type({})


Lua 语言也为面向对象风格的调用(object-oriented call)提供了一种特殊的语法,即冒号操作符。形如 o:foo(x) 的表达式意为调用对象 ofoo 方法。


一个 Lua 程序既可以调用 Lua 语言编写的函数,也可以调用C语言(或者宿主程序使用的其他任意语言)编写的函数。一般来说,我们选择使用C语言编写的函数来实现对性能要求更高,或不容易直接通过 Lua 语言进行操作的操作系统机制等。例如, Lua 语言标准库中所有的函数都是使用C语言编写的。不过,无论一个函数是用 Lua 语言编写的还是用C语言编写的,在调用他们时都没有任何区别。


Lua 语言中的函数定义的常见语法格式如下:

-- 对序列'a'中的元素求和
function add (a)
  local sum = 0
  for i = 1, #a do
    sum = sum + a[i]
  end
  return sum
end


在这种语法中,一个函数定义具有一个函数名、一个参数组成的列表和由一组语句组成的函数体。参数的行为与局部变量的行为完全一致,相当于一个用函数调用时传入的值进行初始化的局部变量。


调用函数时使用的参数个数可以与定义函数时使用的参数个数不一致。 Lua 语言会通过抛弃多余参数和将不足的参数设为 nil 的方式来调整参数的个数。

function f (a, b) print(a, b) end


其行为如下:

f()           --> nil   nil
f(3)          --> 3     nil
f(3, 4)       --> 3     4
f(3, 4, 5)    --> 3     4       (5被丢弃)


虽然这种行为可能导致编程错误(在单元测试中容易发现),但同样又是有用的,尤其是对于默认参数的情况。例如对下面的递增全局计数器函数:

function incCount (n)
  n = n or 1
  globalCounter = globalCounter + n
end


该函数以 1 作为默认实参,当调用无参数的 incCount() 时,将 globalCounter1 。在调用 incCount() 时, Lua 语言首先把参数 n 初始化为 nil ,接下来的 or 表达式又返回了其第二个操作数,最终把 n 赋成了默认值 1

目录
相关文章
|
11月前
|
人工智能 Python
083_类_对象_成员方法_method_函数_function_isinstance
本内容主要讲解Python中的数据类型与面向对象基础。回顾了变量类型(如字符串`str`和整型`int`)及其相互转换,探讨了加法在不同类型中的表现。通过超市商品分类比喻,引出“类型”概念,并深入解析类(class)与对象(object)的关系,例如具体橘子是橘子类的实例。还介绍了`isinstance`函数判断类型、`type`与`help`探索类型属性,以及`str`和`int`的不同方法。最终总结类是抽象类型,对象是其实例,不同类型的对象有独特运算和方法,为后续学习埋下伏笔。
217 7
083_类_对象_成员方法_method_函数_function_isinstance
|
11月前
|
Python
[oeasy]python086方法_method_函数_function_区别
本文详细解析了Python中方法(method)与函数(function)的区别。通过回顾列表操作如`append`,以及随机模块的使用,介绍了方法作为类的成员需要通过实例调用的特点。对比内建函数如`print`和`input`,它们无需对象即可直接调用。总结指出方法需基于对象调用且包含`self`参数,而函数独立存在无需`self`。最后提供了学习资源链接,方便进一步探索。
281 17
|
11月前
|
人工智能 Python
[oeasy]python083_类_对象_成员方法_method_函数_function_isinstance
本文介绍了Python中类、对象、成员方法及函数的概念。通过超市商品分类的例子,形象地解释了“类型”的概念,如整型(int)和字符串(str)是两种不同的数据类型。整型对象支持数字求和,字符串对象支持拼接。使用`isinstance`函数可以判断对象是否属于特定类型,例如判断变量是否为整型。此外,还探讨了面向对象编程(OOP)与面向过程编程的区别,并简要介绍了`type`和`help`函数的用法。最后总结指出,不同类型的对象有不同的运算和方法,如字符串有`find`和`index`方法,而整型没有。更多内容可参考文末提供的蓝桥、GitHub和Gitee链接。
270 11
|
JavaScript
箭头函数与普通函数(function)的区别
箭头函数是ES6引入的新特性,与传统函数相比,它有更简洁的语法,且没有自己的this、arguments、super或new.target绑定,而是继承自外层作用域。箭头函数不适用于构造函数,不能使用new关键字调用。
|
数据可视化 开发者 索引
详解Wireshark LUA插件函数:function p_myproto.dissector(buffer, pinfo, tree)
在 Wireshark 中,LUA 插件通过 `function p_myproto.dissector(buffer, pinfo, tree)` 扩展协议解析能力,解析自定义应用层协议。参数 `buffer` 是 `PacketBuffer` 类型,表示原始数据包内容;`pinfo` 是 `ProtoInfo` 类型,包含数据包元信息(如 IP 地址、协议类型等);`tree` 是
824 1
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。
207 0
【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.
【Azure Durable Function】PowerShell Activity 函数遇见 Newtonsoft.Json.JsonReaderException: The reader's MaxDepth of 64 has been exceeded.
167 3
|
安全 JavaScript 应用服务中间件
【Azure Function App】如何修改Azure函数应用的默认页面呢?
【Azure Function App】如何修改Azure函数应用的默认页面呢?
141 3
|
C# C++ Python
【Azure 应用服务】Azure Durable Function(持久函数)在执行Activity Function时候,因为调用函数名称错误而导致长时间无响应问题
【Azure 应用服务】Azure Durable Function(持久函数)在执行Activity Function时候,因为调用函数名称错误而导致长时间无响应问题

热门文章

最新文章