是否有任何方法来初始化一个顺序值,而不是在一个人的斜线?
比如,我可以声明它,然后使用一个for循环来逐步填充它吗?
由于所有这些都可能发生在类体中,一旦类实例构造阶段完成,Sequential值的真正不可变性就可以启动。
示例:
Sequential<String> strSeq;
for (i in span(0,10)) {
strSeq[i] = "hello";
}这段代码不起作用,因为我得到了这个错误:
错误:(12,9)锡兰:索引表达式的非法接收类型:“顺序”不是“KeyedCorrespondenceMutator”或“IndexedCorrespondenceMutator”的子类型
所以我可以得出结论,序列必须在一条语句中指定,对吗?
发布于 2017-09-06 20:51:41
用于创建序列文字接受的方括号不仅接受逗号分隔的值列表,而且还用于理解:
String[] strSeq = [for (i in 0..10) "hello"];你也可以同时做这两件事,只要理解是最后一次:
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-解析式不在方括号中):
[Integer, Character][] pairs = [for (i in 0..2) for (j in "abc") [i, j]];Foo[]是Sequential<Foo>的缩写,x..y的意思是span(x, y)。
发布于 2017-09-06 20:52:51
是的,有几种语言保证取决于顺序对象的不可变性,因此这种语言必须保证不变性--它不能仅仅相信在初始化完成后您不会对其进行变异:)
通常,在这种情况下,您所做的是构建某种集合(例如,从ceylon.collection生成的ceylon.collection的 ),随您的意愿对其进行变异,然后在完成后获取它的.sequence()。
您的具体案例也可以作为顺序文字中的理解写成:
String[] strSeq = [for (i in 0..10) "hello"];发布于 2017-09-06 22:05:28
如果您预先知道要创建的序列的大小,那么一个非常有效的方法是使用Array
value array = Array.ofSize(11, "");
for (i in 0:11) {
array[i] = "hello";
}
String[] strSeq = array.sequence();另一方面,如果您不预先知道大小,那么,正如Lucas所描述的,您需要使用以下两种方法之一:
ArrayList。https://stackoverflow.com/questions/46083902
复制相似问题