File &引用;终生;openwriter()创建的通道变量的
下面的代码是创建具有通道的类的另一次尝试。在这里,我直接从调用方传递通道,而不是在类中打开它。虽然代码给出了预期的结果,但我想知道这样做是否合法,特别是在File &引用;终生;openwriter()创建的通道变量的,file,parameter-passing,chapel,File,Parameter Passing,Chapel,下面的代码是创建具有通道的类的另一次尝试。在这里,我直接从调用方传递通道,而不是在类中打开它。虽然代码给出了预期的结果,但我想知道这样做是否合法,特别是在new语句中直接调用openwriter()(如baa)。换句话说,只要存在引用基础文件的变量(此处为Myclass中的output),即使实际通道变量为临时变量,也可以假定文件保持打开状态吗 class Myclass { var output: channel; proc init( output = stdout )
new
语句中直接调用openwriter()
(如baa
)。换句话说,只要存在引用基础文件的变量(此处为Myclass
中的output
),即使实际通道变量为临时变量,也可以假定文件保持打开状态吗
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 );
}
我相信你的代码应该是很好的。文件和通道的文档表明它们是引用计数的,因此只要有某个变量引用它们,它们就应该保持活动状态。以下引用自1.19版文件: 文件和通道是引用计数的。当没有对每个文件和通道的引用保留时,将自动关闭该文件和通道。例如,如果局部变量是通道的唯一引用,则当该变量超出范围时,通道将关闭。程序也可以显式关闭文件或通道
是的,这应该继续工作,因为文件和通道是引用计数的 另见
也注意到,在当前时间,Chapel中的临时变量在封闭块结束时被破坏(而不是在语句的结尾,这是C++所做的)。在这种情况下这无关紧要,因为在语句
var baa=…
完成之前,MyClass初始值设定项中通道的引用计数会增加。这有时会令人惊讶(请参阅),因此我们正在考虑调整(请参阅)。非常感谢,答案在在线文档中写得非常清楚。。。XD(我会更仔细地阅读这一页)。虽然有两个答案,但我会接受另一个,因为它有更多的信息。但再次感谢:)非常感谢!很高兴了解通道的引用计数,以及每个语句都不会破坏临时变量的事实(事实上,我的想象正好相反……)