函数Return一个关联数组
Function Return an Associative Array
如何在 Chapel 中使用函数 return 关联数组?这很自然,但似乎不起作用:
type keys = domain(int);
type arr = [keys] int;
proc factor(q): arr {
...
}
我得到的错误输出是:
error: unresolved call 'chpl__ensureDomainExpr(type DefaultAssociativeDom(int(64),true))'
$CHPL_HOME/modules/internal/ChapelArray.chpl:642: note: candidates are: chpl__ensureDomainExpr(const ref x: domain)
$CHPL_HOME/modules/internal/ChapelArray.chpl:649: note: chpl__ensureDomainExpr(x ...)
这是一个可以执行此操作的工作程序:
proc returnsAssocArray() {
var AssocDom:domain(int);
var AssocArray:[AssocDom] int;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
以上是我会使用的模式,可能会满足您的要求。
请注意,Chapel 中的数组和域具有 runtime 关系,并且数组的类型包括 runtime 域。因此,虽然您发布的代码有一天可能会起作用,但一般来说,要指定一个数组类型,需要指定一个在运行时可用的域。
假设您希望在返回的所有关联数组中共享一个域(又名键集),您可以这样做:
var AssocDom:domain(int);
AssocDom += 1; // add index 1 to the associative domain
type AssocArrayType = [AssocDom] int;
proc returnsAssocArray(): AssocArrayType {
var AssocArray:AssocArrayType;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
但是,如果 returnsAssocArray
想要将 2
添加到域(比如说),事情可能不会如您所愿:
- 将
2
添加到 AssocDom 将调整在该域上创建的任何其他数组的大小
- 仅当没有其他阵列共享该域时,仅执行
AssocArray[2] = 100
将添加到该域。
Chapel 的未来版本可能会有一个 Map
类型来简化此类用例并为地图提供更熟悉的界面。此外,如果没有其他数组共享,则添加到关联域的规则可能会消失。
如何在 Chapel 中使用函数 return 关联数组?这很自然,但似乎不起作用:
type keys = domain(int);
type arr = [keys] int;
proc factor(q): arr {
...
}
我得到的错误输出是:
error: unresolved call 'chpl__ensureDomainExpr(type DefaultAssociativeDom(int(64),true))'
$CHPL_HOME/modules/internal/ChapelArray.chpl:642: note: candidates are: chpl__ensureDomainExpr(const ref x: domain)
$CHPL_HOME/modules/internal/ChapelArray.chpl:649: note: chpl__ensureDomainExpr(x ...)
这是一个可以执行此操作的工作程序:
proc returnsAssocArray() {
var AssocDom:domain(int);
var AssocArray:[AssocDom] int;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
以上是我会使用的模式,可能会满足您的要求。
请注意,Chapel 中的数组和域具有 runtime 关系,并且数组的类型包括 runtime 域。因此,虽然您发布的代码有一天可能会起作用,但一般来说,要指定一个数组类型,需要指定一个在运行时可用的域。
假设您希望在返回的所有关联数组中共享一个域(又名键集),您可以这样做:
var AssocDom:domain(int);
AssocDom += 1; // add index 1 to the associative domain
type AssocArrayType = [AssocDom] int;
proc returnsAssocArray(): AssocArrayType {
var AssocArray:AssocArrayType;
AssocArray[1] = 100;
return AssocArray;
}
var A = returnsAssocArray();
for (key,value) in zip(A.domain, A) {
writeln("A[", key, "] = ", value);
}
但是,如果 returnsAssocArray
想要将 2
添加到域(比如说),事情可能不会如您所愿:
- 将
2
添加到 AssocDom 将调整在该域上创建的任何其他数组的大小 - 仅当没有其他阵列共享该域时,仅执行
AssocArray[2] = 100
将添加到该域。
Chapel 的未来版本可能会有一个 Map
类型来简化此类用例并为地图提供更熟悉的界面。此外,如果没有其他数组共享,则添加到关联域的规则可能会消失。