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

时间:2017-09-06 20:34:08

标签: ceylon

有没有办法在一个伙伴中初始化一个顺序值而不是

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

因为这可能都发生在一个类体内,所以一旦类实例构建阶段完成,Sequential值的真正不变性就会启动。

示例:

Sequential<String> strSeq;

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

此代码不起作用,因为我收到此错误:

  

错误:(12,9)ceylon:索引表达式的非法接收类型:   'Sequential'不是'KeyedCorrespondenceMutator'的子类型   'IndexedCorrespondenceMutator'

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

3 个答案:

答案 0 :(得分:5)

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

通常情况下,您在这种情况下所做的是构建某种集合(例如来自ArrayList的{​​{1}}),根据需要对其进行变更,然后将其{{1}当你完成时。

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

ceylon.collection

答案 1 :(得分:4)

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

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)

答案 2 :(得分:4)

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

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

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

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