程序开发中函数定义与调用的理解与运用?
1个回答
2021-06-21 · 学动漫、设计、电竞、电商、短视频、软件等
关注
展开全部
函数就是把特定的代码整理到一个代码块里面去,并起个名字,哪里需要使用就调用这个名字。
一个函数定义是一个可执行的表达式, 执行结果是一个类型为 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 只有单一函数调用作为参数时才发生尾调用; 这种语法使得调用函数的所有结果可以完整地返回。
一个函数定义是一个可执行的表达式, 执行结果是一个类型为 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 只有单一函数调用作为参数时才发生尾调用; 这种语法使得调用函数的所有结果可以完整地返回。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询