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

目录
相关文章
|
6天前
|
JavaScript 前端开发
JavaScript函数是代码复用的关键。使用`function`创建函数
【6月更文挑战第22天】JavaScript函数是代码复用的关键。使用`function`创建函数,如`function sayHello() {...}`或`function addNumbers(num1, num2) {...}`。调用函数如`sayHello()`执行其代码,传递参数按值进行。函数可通过`return`返回值,无返回值默认为`undefined`。理解函数对于模块化编程至关重要。
17 4
|
13天前
|
JSON 数据格式
setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常
setInterval函数的function与()=>区别——解决Cannot readproperty‘XXXXXXX‘of undefined异常
9 0
|
1月前
|
JavaScript 前端开发
在JavaScript中,函数原型(Function Prototype)是一个特殊的对象
【5月更文挑战第11天】JavaScript中的函数原型是一个特殊对象,它为所有函数实例提供共享的方法和属性。每个函数在创建时都有一个`prototype`属性,指向原型对象。利用原型,我们可以向所有实例添加方法和属性,实现继承。例如,我们定义一个`Person`函数,向其原型添加`greet`方法,然后创建实例`john`和`jane`,它们都能调用这个方法。尽管可以直接在原型上添加方法,但推荐在构造函数内部定义以封装数据和逻辑。
31 2
|
25天前
|
JavaScript 编译器 前端开发
11.【TypeScript 教程】函数(Function)
11.【TypeScript 教程】函数(Function)
8 0
|
1月前
|
存储 算法 对象存储
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
【C++入门到精通】function包装器 | bind() 函数 C++11 [ C++入门 ]
30 1
|
1月前
|
存储
function(函数)
在 Lua 中,函数作为第一类值可存储于变量,如示例所示:`factorial1` 和 `factorial2` 存储相同函数。此外,函数可作为参数传递,如 `testFun` 接收一个表和一个匿名函数,该匿名函数在迭代中处理键值对,输出 `key1=val1` 和 `key2=val2`。
|
1月前
|
JavaScript 前端开发
【专栏】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表
【4月更文挑战第29天】`Function.prototype.apply` 在JavaScript中用于动态设定函数上下文(`this`)和参数列表。它接受两个参数:上下文对象和参数数组。理解`apply`有助于深入JS运行机制。文章分三部分探讨其原理:基本概念和用法、工作原理详解、实际应用与注意事项。在应用中要注意性能、参数类型和兼容性问题。`apply`可用于动态改变上下文、传递参数数组,甚至模拟其他语言的调用方式。通过深入理解`apply`,能提升代码质量和效率。
|
1月前
|
Serverless 应用服务中间件 数据安全/隐私保护
Serverless 应用引擎操作报错合集之在阿里函数计算中,函数执行超时,报错Function time out after如何解决
Serverless 应用引擎(SAE)是阿里云提供的Serverless PaaS平台,支持Spring Cloud、Dubbo、HSF等主流微服务框架,简化应用的部署、运维和弹性伸缩。在使用SAE过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
1月前
|
资源调度 Serverless 计算机视觉
高斯函数 Gaussian Function
**高斯函数,或称正态分布,以数学家高斯命名,具有钟形曲线特征。关键参数包括期望值μ(决定分布中心)和标准差σ(影响分布的宽度)。当μ=0且σ²=1时,分布为标准正态分布。高斯函数广泛应用于统计学、信号处理和图像处理,如高斯滤波器用于图像模糊。其概率密度函数为e^(-x²/2σ²),积分结果为误差函数。在编程中,高斯函数常用于创建二维权重矩阵进行图像的加权平均,实现模糊效果。
61 1
|
1月前
|
算法 Serverless C语言
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
CMake函数和宏(function和macro):使用函数和宏提高代码可读性
44 1

热门文章

最新文章