使用for循环初始化顺序值?

Initialising Sequential values with for loop?

有什么方法可以一次性初始化一个顺序值而不是

比如,我可以声明它,然后使用 for 循环逐步填充它吗?

由于这一切都可能发生在 class 体内,因此一旦 class 实例构造阶段完成,Sequential 值的真正不变性就会开始。

示例:

Sequential<String> strSeq;

for (i in span(0,10)) {
    strSeq[i] = "hello";
}

此代码无效,因为我收到此错误:

Error:(12, 9) ceylon: illegal receiving type for index expression: 'Sequential' is not a subtype of 'KeyedCorrespondenceMutator' or 'IndexedCorrespondenceMutator'

所以我可以得出结论,序列 必须 one 语句中分配,对吗?

用于创建序列文字的方括号不仅接受逗号分隔的值列表,还接受理解:

String[] strSeq = [for (i in 0..10) "hello"];

你也可以同时做,只要for-comprehension放在最后:

String[] strSeq = ["hello", "hello", for (i in 0..8) "hello"];

在这种特定情况下,您也可以这样做:

String[] strSeq = ["hello"].repeat(11);

你也可以通过嵌套得到一个序列:

String[][] strSeqSeq = [for (i in 0..2) [for (j in 0..2) "hello"]];

你可以做笛卡尔积(注意这里嵌套的 for-comprehension 不在方括号中):

[Integer, Character][] pairs = [for (i in 0..2) for (j in "abc") [i, j]];

Foo[]Sequential<Foo>的缩写,x..y翻译成span(x, y)

是的,有几种语言保证取决于顺序对象的不变性,因此语言必须保证不变性——它不能只相信你不会在初始化完成后改变它:)

通常,您在这种情况下所做的是构建某种集合(例如 ceylon.collection 中的 ArrayList),根据需要对其进行变异,然后将其 .sequence() 完成后。

您的具体情况也可以写成顺序文字中的理解:

String[] strSeq = [for (i in 0..10) "hello"];

如果您预先知道要创建的序列的大小,那么一种非常有效的方法是使用 Array:

value array = Array.ofSize(11, "");
for (i in 0:11) {
    array[i] = "hello";
}
String[] strSeq = array.sequence();

另一方面,如果您预先知道大小,那么,如 Lucas 所述,您需要使用以下任一方法:

  • 理解,或者
  • 某种可增长的数组,例如 ArrayList.