有没有办法在一个伙伴中初始化一个顺序值而不是?
喜欢,我可以声明它,然后使用for循环来逐步填充它吗?
因为这可能都发生在一个类体内,所以一旦类实例构建阶段完成,Sequential值的真正不变性就会启动。
示例:
Sequential<String> strSeq;
for (i in span(0,10)) {
strSeq[i] = "hello";
}
此代码不起作用,因为我收到此错误:
错误:(12,9)ceylon:索引表达式的非法接收类型: 'Sequential'不是'KeyedCorrespondenceMutator'的子类型 'IndexedCorrespondenceMutator'
所以我可以得出结论,必须在一个语句中分配序列,对吗?
答案 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
。