跳到主要内容
版本:release

参数访问表达式

语法

形式语法
1$[0-9]+
2$ ( 表达式 )
3$ <
4$ ?

描述

参数访问表达式用于访问当前函数调用的实参。通常用于获取被传递给变长形参的值。

void foo(int v, ...)
{
printlnf("%O %O %O %O", v, $1, $2, $3); // 访问实参
}
foo(10, 20, 30, 40); // 输出 "10 10 20 30"

获取指定位置的参数(形式1,形式2)

如形式1 所示,可以使用 $ 后跟一个数字来访问指定位置的实参,位置从 1 开始计数,$1 代表第一个 实参,$2 代表第二个实参,依此类推。

形式1 只支持字面量数字,如果需要使用其他表达式计算出的位置,可以使用如形式2 所示的语法,使用 $ 后跟括号和一个表达式来访问指定位置的实参:

void foo(int v, ...)
{
int index = 2;
printlnf("%O", $(index)); // 访问第二个实参
}
foo(10, 20, 30, 40); // 输出 "20"

获取全部参数作为数组(形式3)

如形式3 所示,可以使用 $< 来获取所有实参作为一个 array

void foo(int v, ...)
{
array args = $<;
printlnf("%O", args); // 访问所有实参
}
foo(10, 20, 30, 40); // 输出: [ /* sizeof() == 4 */
// 10,
// 20,
// 30,
// 40,
// ]

获取参数数量(形式4)

如形式4 所示,可以使用 $? 来获取实参的数量:

void foo(int v, ...)
{
int count = $?; // 获取实参数量
writeln(count);
}
foo(10, 20, 30, 40); // 输出 4

示例

void foo(int v, string m = "example", ...)
{
writeln($1); // 访问第一个实参
writeln($(2)); // 访问第二个实参
writeln($<); // 访问所有实参
writeln($?); // 访问实参数量
}

foo(10); // 10, "example", [10, example] 和 2
foo(10, "test", 20, 30, 40); // 10, "test", [10, test, 20, 30, 40] 和 5