out 参数是其值隐式重新初始化的引用



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
} 

我没有看到任何将outref进行比较的文档.
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。相反,它使用 inoutinout 作为参数存储类。

in的意思是(并且意味着它仍然存在(您将要查看,但不会修改或存储对它的引用(后者是使其与const不同的原因 - 您可以存储const,但不能存储inscope参数,这让编译器在理论上, 优化它们的内存分配(。它仅用于数据消费。

out意味着函数将数据存储在该变量中,但不打算查看或存储它。当函数将其结果写入其中时,预先存在的值将丢失。编译器在函数输入时重置它,以确保程序不依赖于通过它传入的某个值。

最后,旧inout是它会将数据传入,并存储一个值。今天(好吧,从五年前开始(,这种用法早已不复存在,inout意味着完全不同的东西(const但返回恒常性取决于输入;常量/不可变/可变限定符与它们相同(,旧用法被替换为ref,这也扩展了含义: 它不再是进出的数据,而是对另一个变量的完整引用,这意味着您可以执行诸如获取地址之类的操作。

虽然out实现为ref加上自动重新初始化,但您应该记住原始含义:您向其写入数据但不执行任何其他操作。不要采用它的地址 - 这对ref来说是合法的(除非它是scope refin ref......(,但对out来说是不正确的。你应该写信给它,仅此而已。

out 参数是其值隐式重新初始化的 ref 吗?

是的。

在函数输入时使用默认值初始化参数后,它本质上不就是一个 ref 吗?

是的。

是否可以在这些参数

存储类之间进行更严格的区分,或者它真的是一个自动重新初始化的 ref 参数?

后者。至少,我是这么想的。我希望我没有错过什么。

相关内容

  • 没有找到相关文章

最新更新