使用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
.
有什么方法可以一次性初始化一个顺序值而不是?
比如,我可以声明它,然后使用 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
.