gpt4 book ai didi

file - openwriter() 创建的 channel 变量的 "Lifetime"

转载 作者:行者123 更新时间:2023-12-01 11:14:05 25 4
gpt4 key购买 nike

下面的代码是另一种创建带有 channel 的类的尝试。在这里,我直接从调用方传递一个 channel ,而不是在类中打开它。虽然代码给出了预期的结果,但我想知道这样做是否合法,特别是通过在 new 语句中直接调用 openwriter() (如在baa 的情况)。换句话说,是否可以假设只要存在引用基础文件的变量(此处为 output in Myclass)文件就保持打开状态,即使实际 channel 变量是临时的?

class Myclass
{
var output: channel;
proc init( output = stdout )
{
this.output = output;
}
}

proc main()
{
var foo = new owned Myclass();
foo.output.writeln( 10 ); // written to stdout

var baa = new owned Myclass( openwriter("test.out") );
baa.output.writeln( 20 ); // written to file
baa.output.writeln( 30 );
}

最佳答案

是的,这应该会继续有效,因为文件和 channel 是引用计数的。

另见 https://chapel-lang.org/docs/modules/standard/IO.html#functions-for-closing-channels

另请注意,目前,Chapel 中的临时变量在封闭 block 的末尾被销毁(而不是在语句末尾,这是 C++ 所做的)。在这种情况下这无关紧要,因为在语句 var baa = ... 完成之前, channel 的引用计数会在 MyClass 初始值设定项中增加。这有时会令人惊讶(参见 https://github.com/chapel-lang/chapel/issues/11492),我们正在考虑调整(参见 https://github.com/chapel-lang/chapel/issues/11534)。

关于file - openwriter() 创建的 channel 变量的 "Lifetime",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com