format - 使用方括号输出数组元素
问题描述
此代码创建一个记录变量 ( r
) 和一个元组变量 ( t
),其中包含多个数组并将它们打印到标准输出:
const N = 5;
record Myrec {
var a: [1..N] int = (for i in 1..N do i);
var b: [1..N] int = (for i in 1..N do i);
var c: [1..N] int = (for i in 1..N do i);
}
proc test() {
var r: Myrec;
var t = (r.a, r.b, r.c);
writeln( "r = ", r );
writeln( "t = ", t );
}
test();
如果我运行这段代码,我会得到这个输出:
r = (a = 1 2 3 4 5, b = 1 2 3 4 5, c = 1 2 3 4 5)
t = (1 2 3 4 5, 1 2 3 4 5, 1 2 3 4 5)
但我觉得输出不是很可读(特别是在 的情况下t
)。所以,我想知道是否有某种方法可以用方括号打印这些变量,例如,如下所示?
t = ([1 2 3 4 5], [1 2 3 4 5], [1 2 3 4 5])
我认为可以通过使用writef()
+格式字符串+传递元组的每个字段(或为此目的编写特定函数)来实现,但如果有一些方便的方法来实现类似的目标会很好......
解决方案
根据FormattedIO的文档,格式字符串%ht
(或%jt
)似乎完成了[...]
为数组元素添加的工作。修改后的示例代码附在下面:
record Myrec {
var n = 100;
var a = [1,2,3];
var x = 1.23;
}
proc test() {
var r: Myrec;
var t = (r.a, r.a);
writeln();
writeln( "r = ", r );
writef( "r = %ht\n", r ); // "h" -> Chapel style
writef( "r = %jt\n", r ); // "j" -> JSON style
writeln();
writeln( "t = ", t );
writef( "t = %ht\n", t );
var arr2d: [1..2, 1..3] int = (for i in 1..6 do i);
writeln();
writeln( "arr2d =\n", arr2d );
writef( "arr2d =\n%ht\n", arr2d );
}
test();
输出
r = (n = 100, a = 1 2 3, x = 1.23)
r = new Myrec(n = 100, a = [1, 2, 3], x = 1.230000e+00)
r = {"n":100, "a":[1, 2, 3], "x":1.230000e+00}
t = (1 2 3, 1 2 3)
t = ([1, 2, 3], [1, 2, 3])
arr2d =
1 2 3
4 5 6
arr2d =
[
[1, 2, 3],
[4, 5, 6]
]
推荐阅读
- ruby - 液体 - 除非 for.loop 似乎总是最后一个
- sql - 如果结果 = 0/null 那么改变在哪里?
- regex - 使用正则表达式在 {{}} 之间提取变量
- python - 将两个列表相减,如果值为负,则从第一个列表中取值(Python)
- java - 如何在 WSO2 ESB 6.6.0 中使代理内的缓存无效
- javascript - 获取有效的 http get 请求(第 3 方 api)并改用 fetch,但签名不匹配
- aws-iot - AWS IOT 创造事物的限制
- javascript - Javascript中的箭头函数到另一个箭头函数意味着什么?
- javascript - 使用 jQuery 按钮更新 Leaflet 地图中的圆形图层,但在单击按钮时获取“eachLayer 不是函数”
- python - 如果值不存在,将值插入 MySQL 表?