程序开发中函数定义与调用的理解与运用?

程序开发中函数定义与调用的理解与运用?,第1张

函数就是把特定的代码整理到一个代码块里面去,并起个名字,哪里需要使用就调用这个名字。

一个函数定义是一个可执行的表达式, 执行结果是一个类型为 function 的值。 当 Lua 预编译一个代码块时, 代码块作为一个函数,整个函数体也就被预编译了。 那么,无论何时 Lua 执行了函数定义, 这个函数本身就进行了 实例化(或者说是 关闭了)。 这个函数的实例(或者说是 闭包)是表达式的最终值。

形参被看作是一些局部变量, 它们将由实参的值来初始化

当一个函数被调用, 如果函数并非一个 可变参数函数, 即在形参列表的末尾注明三个点 ('...'), 那么实参列表就会被调整到形参列表的长度。 变长参数函数不会调整实参列表; 取而代之的是,它将把所有额外的参数放在一起通过 变长参数表达式传递给函数, 其写法依旧是三个点。 这个表达式的值是一串实参值的列表, 看起来就跟一个可以返回多个结果的函数一样。 如果一个变长参数表达式放在另一个表达式中使用, 或是放在另一串表达式的中间, 那么它的返回值就会被调整为单个值。 若这个表达式放在了一系列表达式的最后一个, 就不会做调整了

结果由 return 来返回。 如果执行到函数末尾依旧没有遇到任何 return 语句, 函数就不会返回任何结果。

关于函数可返回值的数量限制和系统有关。 这个限制一定大于 1000 。

冒号 语法可以用来定义 方法, 就是说,函数可以有一个隐式的形参 self。 因此,

函数调用时, 第一步,prefixexp 和 args 先被求值。 如果 prefixexp 的值的类型是 function, 那么这个函数就被用给出的参数调用。 否则 prefixexp 的元方法 "call" 就被调用, 第一个参数是 prefixexp 的值,

所有参数的表达式求值都在函数调用之前。 这样的调用形式 f{fields} 是一种语法糖用于表示 f({fields}); 这里指参数列表是一个新创建出来的列表。 而这样的形式 f'string' (或是 f"string" 亦或是 f[[string]]) 也是一种语法糖,用于表示 f('string'); 此时的参数列表是一个单独的字符串。

return functioncall 这样的调用形式将触发一次 尾调用。 Lua 实现了 完全尾调用(或称为 完全尾递归): 在尾调用中, 被调用的函数重用调用它的函数的堆栈项。 因此,对于程序执行的嵌套尾调用的层数是没有限制的。 然而,尾调用将删除调用它的函数的任何调试信息。 注意,尾调用只发生在特定的语法下, 仅当 return 只有单一函数调用作为参数时才发生尾调用; 这种语法使得调用函数的所有结果可以完整地返回。

程序是指你为了完成你的功能而编写的项目代码。

文件是信息的保存方式,包括程序文件、库文件、数据文件等。广义上说,设备也包含在文件的定义里面。

由于程序规模可能非常大,编程时往往将将代码划分成若干模块,每一模块对应一个子功能,这样也方便实现程序代码的复用。这一一个模块,在形式上就体现为函数。——如果规模再大一些,可能还需要将一些相关的类封闭成类库,以方便调用,进一步提高程序的复用性。

这些只是经验,谈不上理论,也没必要去钻牛角尖。程序多写一些,你自然就明白了。

明显的差异是:

1、一个程序中主程序只有一个,函数可以有多个。

2、主程序只能返回整形数,函数可以返回任意数据类型。

3、主程序不能嵌套,函数是可以嵌套的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11464791.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存