在这段代码中,我正在创建一个包含一个通道的类,该类可以在初始化时根据要求打开。为此,我传递了一个标志来指示是否打开了通道(以及其文件名)。
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
的一般性质有关(根据错误消息),但是我不太确定如何适当地编写这样的代码...
答案 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