“通道”类型的字段给出错误“无法默认初始化具有通用类型的变量”

时间:2019-03-27 05:59:35

标签: file generics chapel

在这段代码中,我正在创建一个包含一个通道的类,该类可以在初始化时根据要求打开。为此,我传递了一个标志来指示是否打开了通道(以及其文件名)。

class Myclass
{
    var writeflag : bool;
    var output : channel;

    proc init( writeflag = false, filename = "" )
    {
        this.writeflag = writeflag;
        if writeflag {                   // (1)
            assert( filename != "" );
            this.output = openwriter( filename );
        }                                // (2)
    }
}

proc main()
{
    var a = new owned Myclass( writeflag = true,
                               filename = "test.out" );
    a.output.writeln( 123 );
}

但是,编译器拒绝以上代码并显示以下消息:

  

myclass.chpl:6:错误:无法默认初始化具有通用类型的变量   myclass.chpl:6:注意:“未完全实例化”具有通用类型“通道”

另一方面,如果我注释掉(1)和(2),代码将按预期工作并创建“ test.out”。我想这个问题与channel的一般性质有关(根据错误消息),但是我不太确定如何适当地编写这样的代码...

2 个答案:

答案 0 :(得分:2)

  

我想这个问题与通道的一般性质有关(根据错误消息),但不是很确定如何适当地编写这样的代码...

您在正确的轨道上。 channel record有一些参数字段,必须在编译时提供。您可以在字段声明中指定以下参数:

var output : channel(writing=true, kind=iokind.dynamic, locking=false);

答案 1 :(得分:0)

根据答案和评论中的建议,我对代码进行了如下修改。由于具体的类型需要记住,所以我创建了一个类型别名,并在类规范中使用了它(此处为for idx in df.index: for item in mean.Animal: if df.Animal[idx] == mean.Animal[item]: df.at[idx, 'Frequency'] = mean.at[item, 'Frequency'] 的通用性,请参见docs)。

locking=true