Luau学习--8 Function call 函数
2.5.8 – Function Calls
A function call in Lua has the following syntax:
functioncall ::= prefixexp args
In a function call, first prefixexp and args are evaluated. If the value of prefixexp has type function, then this function is called with the given arguments. Otherwise, the prefixexp "call" metamethod is called, having as first parameter the value of prefixexp, followed by the original call arguments (see §2.8).
The form
functioncall ::= prefixexp `:´ Name args
can be used to call "methods". A call v:name(args)
is syntactic sugar for v.name(v,args)
, except that v
is evaluated only once.
Arguments have the following syntax:
args ::= `(´ [explist] `)´ args ::= tableconstructor args ::= String
All argument expressions are evaluated before the call. A call of the form f{fields}
is syntactic sugar for f({fields})
; that is, the argument list is a single new table. A call of the form f'string'
(or f"string"
or f[[string]]
) is syntactic sugar for f('string')
; that is, the argument list is a single literal string.
As an exception to the free-format syntax of Lua, you cannot put a line break before the '(
' in a function call. This restriction avoids some ambiguities in the language. If you write
a = f (g).x(a)
Lua would see that as a single statement, a = f(g).x(a)
. So, if you want two statements, you must add a semi-colon between them. If you actually want to call f
, you must remove the line break before (g)
.
A call of the form return
functioncall is called a tail call. Lua implements proper tail calls (or proper tail recursion): in a tail call, the called function reuses the stack entry of the calling function. Therefore, there is no limit on the number of nested tail calls that a program can execute. However, a tail call erases any debug information about the calling function. Note that a tail call only happens with a particular syntax, where the return has one single function call as argument; this syntax makes the calling function return exactly the returns of the called function. So, none of the following examples are tail calls:
return (f(x)) -- results adjusted to 1 return 2 * f(x) return x, f(x) -- additional results f(x); return -- results discarded return x or f(x) -- results adjusted to 1
1、冒号和点来定义个方法 2、当通过冒号定义方法的时候 默认传一个参数 self ,而使用点定义的时候则不会传递一个默认的self。 3、使用冒号定义方法,可以使用点来调用,如果不显式的把自身当做第一个参数传递的话,那么就会把第一个参数当做自身赋值给self ,参数就会少一个。 4、使用点定义的方法 也可以使用冒号调用,但是如果有两个参数以上的话, 前一个参数 接收的都是自身,最好还是别这么调用。
Function Definitions
The syntax for function definition is
function ::= function funcbody funcbody ::= `(´ [parlist] `)´ block end
The following syntactic sugar simplifies function definitions:
stat ::= function funcname funcbody stat ::= local function Name funcbody funcname ::= Name {`.´ Name} [`:´ Name]
函数定义方法: function name(args) block end
local function name(args)
block
end
A function definition is an executable expression, whose value has type function. When Lua pre-compiles a chunk, all its function bodies are pre-compiled too. Then, whenever Lua executes the function definition, the function is instantiated (or closed). This function instance (or closure) is the final value of the expression. Different instances of the same function can refer to different external local variables and can have different environment tables.
Parameters act as local variables that are initialized with the argument values:
parlist ::= namelist [`,´ `...´] | `...´
When a function is called, the list of arguments is adjusted to the length of the list of parameters, unless the function is a variadic or vararg function, which is indicated by three dots ('...
') at the end of its parameter list. A vararg function does not adjust its argument list; instead, it collects all extra arguments and supplies them to the function through a vararg expression, which is also written as three dots. The value of this expression is a list of all actual extra arguments, similar to a function with multiple results. If a vararg expression is used inside another expression or in the middle of a list of expressions, then its return list is adjusted to one element. If the expression is used as the last element of a list of expressions, then no adjustment is made (unless that last expression is enclosed in parentheses).
As an example, consider the following definitions:
function f(a, b) end function g(a, b, ...) end function r() return 1,2,3 end
Then, we have the following mapping from arguments to parameters and to the vararg expression:
CALL PARAMETERS f(3) a=3, b=nil f(3, 4) a=3, b=4 f(3, 4, 5) a=3, b=4 f(r(), 10) a=1, b=10 f(r()) a=1, b=2 g(3) a=3, b=nil, ... --> (nothing) g(3, 4) a=3, b=4, ... --> (nothing) g(3, 4, 5, 8) a=3, b=4, ... --> 5 8 g(5, r()) a=5, b=1, ... --> 2 3
Results are returned using the return statement (see §2.4.4). If control reaches the end of a function without encountering a return statement, then the function returns with no results.
The colon syntax is used for defining methods, that is, functions that have an implicit extra parameter self
. Thus, the statement
function t.a.b.c:f (params) body end
is syntactic sugar for
t.a.b.c.f = function (self, params) body end
冒号 “:” 使用来定义方法的,并且默认携带self 为第一个参数
1、冒号和点来定义个方法
2、当通过冒号定义方法的时候 默认传一个参数 self ,而使用点定义的时候则不会传递一个默认的self。
3、使用冒号定义方法,可以使用点来调用,如果不显式的把自身当做第一个参数传递的话,那么就会把第一个参数当做自身赋值给self ,参数就会少一个。
4、使用点定义的方法 也可以使用冒号调用,但是如果有两个参数以上的话, 前一个参数 接收的都是自身,最好还是别这么调用。