从其它平台迁移而来


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;

开放数组

开放数组是在函数形参声明时使用的术语,语法为:

1
v : array of Type

开放数组动态数组极为类似,但意义不同,使用开放数组应注意:

  1. 开放数组是形参,可传动态数组,也可传静态数组。

  2. 开放数组索引总是从0到Length()-1,与实参索引无关。

  3. 开放数组只能访问元素,不能对整个数组进行赋值操作。

  4. 开放数组的实参为数组时会创建数组的副本,传递大数组可能导致栈溢出,为避免栈溢出,可使用const或var进行修饰。

开放数组构造器

开放数组构造器的语法为:

1
[实参1, 实参2, 实参3]
  1. 开放数组构造器允许在函数或过程调用中直接构造数组

  2. 仅用于传递开放数组参数或可变类型开放数组参数

可变类型的开放数组

可变类型的开放数组即开放数组的元素类型为可变类型,语法为:

1
2
3
v : array of TVarRec
//
v : array of const    //通常使用该语法

两者的区别是:array of TVarRec可以定义一般的数组变量,array of const只能声明形参为可变类型的开放数组。

注意:可变类型的开放数组形参不能直接传递数组变量,实参必须通过开放数组构造器进行传递。

Go

Go有直接传递可变参数的语法:

1
func Func(args ...type) //...type即为变长类型的形参,当type为interface{}时即可传递任意数量、任意类型的参数
  1. ...type类型的形参只能有一个,且必须为最后一个形参。

  2. ...type本质上是[]type的切片。

  3. 调用时直接用逗号分隔各实参即可。