Dlang将out参数描述为:
在函数输入时初始化的参数,默认值为 它的类型。
在函数输入时用默认值初始化参数后,它本质上不就是一个ref
吗?
import std.stdio;
void foo(out int x)
{
writeln(x); //prints 0
x = 2;
}
void main()
{
int x = 1;
writeln(x); //prints 1
foo(x);
writeln(x); //prints 2
}
我没有看到任何将out
与ref
进行比较的文档.
将out
参数概念化为编写的快捷方式是否准确:
import std.stdio;
void foo(ref int x)
{
x = x.init; //happens implicitly
writeln(x); //prints 0
x = 2;
}
void main()
{
int x = 1;
writeln(x); //prints 1
foo(x);
writeln(x); //prints 2
}
我不知道语言的复杂性,所以我担心在不可预见的情况下,这种印象会给我带来未来的悲伤。
是否可以在这些parameter storage classes
之间做出更强烈的区分,或者它真的是一个自动重新初始化的引用参数?
是的,这就是今天实现的全部内容,但这并不完全是它在语义上的意思。
将out
参数视为额外的返回值,而不是传统意义上的参数,您应该没问题。函数不能获取其返回值的地址,也不能通过它接收数据。out 参数也不应以这些方式使用。
D以前没有ref
。相反,它使用 in
、 out
和 inout
作为参数存储类。
in
的意思是(并且意味着它仍然存在(您将要查看,但不会修改或存储对它的引用(后者是使其与const
不同的原因 - 您可以存储const
,但不能存储in
或scope
参数,这让编译器在理论上, 优化它们的内存分配(。它仅用于数据消费。
out
意味着函数将数据存储在该变量中,但不打算查看或存储它。当函数将其结果写入其中时,预先存在的值将丢失。编译器在函数输入时重置它,以确保程序不依赖于通过它传入的某个值。
最后,旧inout
是它会将数据传入,并存储一个值。今天(好吧,从五年前开始(,这种用法早已不复存在,inout
意味着完全不同的东西(const
但返回恒常性取决于输入;常量/不可变/可变限定符与它们相同(,旧用法被替换为ref
,这也扩展了含义: 它不再是进出的数据,而是对另一个变量的完整引用,这意味着您可以执行诸如获取地址之类的操作。
虽然out
实现为ref
加上自动重新初始化,但您应该记住原始含义:您向其写入数据但不执行任何其他操作。不要采用它的地址 - 这对ref
来说是合法的(除非它是scope ref
或in ref
......(,但对out
来说是不正确的。你应该写信给它,仅此而已。
out 参数是其值隐式重新初始化的 ref 吗?
是的。
在函数输入时使用默认值初始化参数后,它本质上不就是一个 ref 吗?
是的。
是否可以在这些参数存储类之间进行更严格的区分,或者它真的是一个自动重新初始化的 ref 参数?
后者。至少,我是这么想的。我希望我没有错过什么。