从其它平台迁移而来
Delphi#
事实上,Delphi
并没有什么可以直接为函数传递可变参数(数量可变、类型可变)的语法,但是并不是说不可能实现,最常用的Format()
函数就是最好的例子。
虽然不能直接传递可变参数,但是通过一种叫做可变类型的开放数组
即可实现为函数传递数量不定、类型不一的可变参数。
可变类型#
可变类型
不是变体类型
,而是一个记录类型TVarRec
,在System
单元中的定义如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
TVarRec = record { do not pack this record; it is compiler-generated }
case Integer of
0: (case Byte of
vtInteger: (VInteger: Integer);
vtBoolean: (VBoolean: Boolean);
vtChar: (VChar: _AnsiChr);
vtExtended: (VExtended: PExtended);
{$IFNDEF NEXTGEN}
vtString: (VString: _PShortStr);
{$ENDIF !NEXTGEN}
vtPointer: (VPointer: Pointer);
vtPChar: (VPChar: _PAnsiChr);
{$IFDEF AUTOREFCOUNT}
vtObject: (VObject: Pointer);
{$ELSE}
vtObject: (VObject: TObject);
{$ENDIF}
vtClass: (VClass: TClass);
vtWideChar: (VWideChar: WideChar);
vtPWideChar: (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency: (VCurrency: PCurrency);
vtVariant: (VVariant: PVariant);
vtInterface: (VInterface: Pointer);
vtWideString: (VWideString: Pointer);
vtInt64: (VInt64: PInt64);
vtUnicodeString: (VUnicodeString: Pointer);
);
1: (_Reserved1: NativeInt;
VType: Byte;
);
end;
|
开放数组#
开放数组
是在函数形参声明时使用的术语,语法为:
开放数组
与动态数组
极为类似,但意义不同,使用开放数组应注意:
-
开放数组是形参,可传动态数组,也可传静态数组。
-
开放数组索引总是从0到Length()-1,与实参索引无关。
-
开放数组只能访问元素,不能对整个数组进行赋值操作。
-
开放数组的实参为数组时会创建数组的副本,传递大数组可能导致栈溢出,为避免栈溢出,可使用const或var进行修饰。
开放数组构造器#
开放数组构造器的语法为:
-
开放数组构造器允许在函数或过程调用中直接构造数组
-
仅用于传递开放数组参数或可变类型开放数组参数
可变类型的开放数组#
可变类型的开放数组
即开放数组的元素类型为可变类型,语法为:
1
2
3
|
v : array of TVarRec
//或
v : array of const //通常使用该语法
|
两者的区别是:array of TVarRec
可以定义一般的数组变量,array of const
只能声明形参为可变类型的开放数组。
注意:可变类型的开放数组形参不能直接传递数组变量,实参必须通过开放数组构造器进行传递。
Go
有直接传递可变参数的语法:
1
|
func Func(args ...type) //...type即为变长类型的形参,当type为interface{}时即可传递任意数量、任意类型的参数
|
-
...type
类型的形参只能有一个,且必须为最后一个形参。
-
...type
本质上是[]type
的切片。
-
调用时直接用逗号分隔各实参即可。