实参和形参

Time:10 分钟

在函数的定义中,形参的正式名称是变量。而实参的正式名称则是调用函数时出现在函数中的值。让我们看看下面这段代码:

local function printStuff(x) -- 这是一个函数,含有一个形参 x。
	print(x)
end

printStuff("Hello world.") -- "Hello world.” 是一个实参

在本例中,x 是函数 printStuff 的一个形参。形参始终会以这种格式来声明,即位于函数声明的括号内。

在这个函数中,有一个语句 print(x)。该语句会将 x 包含的任何值打印到输出结果中。即便 x 未定义且为空,编译器也不会提示错误,因为该函数尚未被调用。

定义含有形参的函数

以下是定义函数的基本语法:

function name(argument1, arg2, arg3, ...) – 只有在需要的情况下才插入实参

定义函数时,你可以使用形参。因为函数可针对多个值执行任务,所以形参十分实用。例如:

local function addNumbers(x, y)
	return (x + y) -- 你可能希望了解 return 语句
end

上一段代码包含两个形参,因此当调用该函数时,由于 return (x + y) 语句,我们可以向形参 xy 插入任意两个值并返回其和。当前 xy 没有值,但在调用函数时,将会赋予形参 xy 值。请注意,由于函数在声明后会存储于计算机内存中,因此在调用前不会提示错误(除非一开始就存在语法错误)。若情况并非如此,就会像包含以下脚本一样报错:print(x + y) --> attempt to perform arithmetic on global x (a nil value)

形参非常有助于构成能够执行多重任务的函数。

请注意,对于函数及其递减区间来说,所有形参都属于本地参数。

调用含有实参的函数

调用含有实参的函数十分简单,与调用不含实参的函数十分相似。以下是调用含有实参的函数的基本语法:

functionName(value1, value2, value3, ...) – 调用任意数量的实参

请注意,在上述语法中,你在函数声明中创建的第一个形参会变为与 value1 相等,而第二个形参则与 value2 相等,以此类推。

让我们用上一个示例来进行本次演示。

local function addNumbers(x, y)
	return (x + y)
end

local sum = addNumbers(2, 5) -- 注意我是如何调用函数的(请注意,返回值时,函数会包含返回的值)
print(sum) -- 7

**注意:**当调用含有实参的函数时,可以使用任意所需数量的实参。调用的实参过多时,代码将忽略过量的实参;而调用的实参过少时,未表现的形参将返回为空。

可变实参

你可能已发现,诸如 print() 等全局函数可能采用数量不限的实参。无论有多少个实参,它都会将其所有实参打印到输出结果中(每个打印值之间都有一个空格)。例如:

print("LOL", "OMG", "C++ IS PRETTY NEAT IF YOU ASK ME", 1241425717231) -- 4 个实参
print(1, 122, "Hi!", "Roblox", "Give it your best shot!", "C++", "Interesting") -- 7 个实参

看一下输出结果,你将再次看到所有实参都打印在输出结果中。在自定义函数中,你同样可以加入任意数量的实参!字符组 “…” 代表可变实参。请观察以下代码:

local table1 = {}

local function appendToTable(tab, ...)
	local args = {...} -- 你可能希望了解该示例的表格
	for i, v in pairs(args) do
		table.insert(tab, v)
	end
end

appendToTable(table1, "xD", ":D", "lol")

含有实参的函数能够实现非常强大的功能,因为它们可以在脚本的开头声明,并能以各种方式用于整个代码中。存储经常用作函数的代码可以让脚本制作变得格外轻松。

***Roblox官方链接:实参和形参