Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File &引用;终生;openwriter()创建的通道变量的_File_Parameter Passing_Chapel - Fatal编程技术网

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(我会更仔细地阅读这一页)。虽然有两个答案,但我会接受另一个,因为它有更多的信息。但再次感谢:)非常感谢!很高兴了解通道的引用计数,以及每个语句都不会破坏临时变量的事实(事实上,我的想象正好相反……)